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にして,通信部分のダミーが必要かなぁ.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*