New RefBox
RoboCup2019 に合わせて,RefBox のバージョンが1.1.0に変わりました.
大きな変更点は,RefBox <=> MPS の通信がModbus/TCP から OPCUAになったことです.
これに合わせて,MPS の種類として,以下の3つが指定できるようになりました.
- plc
- simluation
- mockup
これは,config.yaml で指定した値を /rcll-refbox/src/refbox/refbox.cpp で,connection_mode として受け取っています.
さて,mockup がdummyMPS として使えるのかどうか,simulationとの違いは何か を調べます.
これらの値は,以下で利用されています.
wataru@ubuntu:~/rcll-refbox/src/libs/mps_comm$ grep MOCKUP * machine.cpp: if (connection_mode_ == MOCKUP) { machine.cpp: if (connection_mode_ == MOCKUP) { machine.cpp: if (connection_mode_ == MOCKUP) { machine.h: enum ConnectionMode { MOCKUP, SIMULATION, PLC, };
とりあえず,この部分を読み進めます.
上記が出てくるのは,send_command の関数です.
void Machine::send_command(unsigned short command, unsigned short payload1, unsigned short payload2, int timeout, unsigned char status, unsigned char error) { std::function<void(void)> call = [this, command, payload1, payload2, status, error] {
たぶん,OPCUA の仕様に従って,通信データを送信するところなのかなぁと思います.
if (connection_mode_ == MOCKUP) { if (command > 100) { mock_callback(OpcUtils::MPSRegister::STATUS_BUSY_IN, true); std::this_thread::sleep_for(mock_busy_duration_); mock_callback(OpcUtils::MPSRegister::STATUS_BUSY_IN, false); mock_callback(OpcUtils::MPSRegister::STATUS_READY_IN, true); std::this_thread::sleep_for(mock_ready_duration_); mock_callback(OpcUtils::MPSRegister::STATUS_READY_IN, false); } return; }
とりあえず,MOCKUP だったら,mock_callbackってのを呼び出しているっぽいです.
mock_callback は,第一引数がレジスタの名前で,第二引数が戻り値っぽいです.
つまり,相手先と通信せずに,同じ動作結果を返している って感じでしょうか.
simulation との違いがわかりませんが….
void Machine::mock_callback(OpcUtils::MPSRegister reg, OpcUtils::ReturnValue *ret) { for (auto &cb : callbacks_) { if (std::get<1>(cb) == reg) { SubscriptionClient::ReturnValueCallback fct = std::get<0>(cb); fct(ret); } } }
MOCKUP関係に対応する実機仕様は,以下です.
OpcUtils::MPSRegister registerOffset; if (command < Station::STATION_BASE) registerOffset = OpcUtils::MPSRegister::ACTION_ID_BASIC; else registerOffset = OpcUtils::MPSRegister::ACTION_ID_IN; bool statusBit = (bool)(status & Status::STATUS_BUSY); OpcUtils::MPSRegister reg; reg = registerOffset + OpcUtils::MPSRegister::ACTION_ID_IN; setNodeValue(registerNodes[reg], (uint16_t)command, reg); reg = registerOffset + OpcUtils::MPSRegister::DATA_IN; setNodeValue(registerNodes[reg].GetChildren()[0], (uint16_t)payload1, reg); reg = registerOffset + OpcUtils::MPSRegister::DATA_IN; setNodeValue(registerNodes[reg].GetChildren()[1], (uint16_t)payload2, reg); reg = registerOffset + OpcUtils::MPSRegister::STATUS_ENABLE_IN; setNodeValue(registerNodes[reg], statusBit, reg); reg = registerOffset + OpcUtils::MPSRegister::ERROR_IN; setNodeValue(registerNodes[reg], (uint8_t)error, reg); success = true; } catch (std::runtime_error &e) { logger->warn("Failed to send command to {}, reconnecting", name_); subscriptions.clear(); connect_PLC(); success = false; } } while (!success);
simulationでgrep してみたら,色々呼び出すところの引数に含まれているので,接続なども行わないという感じです.
とすると,mockup は,接続自身は試みるのでしょうか?
試しに,一つmockupからsimulationに変えてみたところ,
New logging session started [2019-06-30 05:18:39.909] [C-BS] [info] Connecting to: opc.tcp://192.168.2.27:4840/ [2019-06-30 05:18:39.910] [C-BS] [error] OPC UA connection error: regex_error (@/home/wataru/vega/lab/btr2019/sydney/rcll-refbox/ src/libs/mps_comm/machine.cpp:255) Config: C-CS1 prefix /llsfrb/mps/stations/C-CS1/ [2019-06-30 05:18:39.911] [C-CS1] [info]
とのエラーが.なんか,つなぎに行ってる気がするぞ….
simulationとmockup の位置づけが逆のように思えます….
もしくは,simulation にしていたら,gazebo の方につなぎにいこうとするのかなぁ.
じゃあ,やっぱりMPS側に載せた機器で類似した動きをしたかったら,opcにして,通信部分のダミーが必要かなぁ.
コメントを残す