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にして,通信部分のダミーが必要かなぁ.
コメントを残す