Omron#NX1 MQTT Communications Libraryを使ってみよう

今回の記事ではOmronのSysmac Libraryを使用しMQTT通信を行います。Broker側ではPLCNEXTとPodmanのContainer技術の組み合わせですが、普通のRapsberry Piでも問題ありません。よろしくお願いします。

Reference Link

Build a Broker

PLCNEXT#podman MQTT Brokerを自動的に起動する
MQTT#Brokerのセットアップ
Wago#pfc-kbus-apiを使ってみよう

MQTT Program With Other CPU

Project#RoboDK x TwinCAT x MQTT x Opencv Color Dectector
M5Stack#LAN W5500 with MQTT
Beckhoff#TwinCAT TF6701 TopicをSubscribeする
Beckhoff#Play with EK9160 Iot Coupler
Beckhoff#TF6730,TF6735 IotCommunicator使ってみよう
シーメンス#S7-1500とCC712でAws IOT CoreからMessageをPublishしましょう
Beckhoff#TwinCAT TF6701 AWS IOT CoreにMessage Publishする
シーメンス#S7-1500とCC712でAws IOT Coreを繋がりましょう
シーメンス#S7-1500でMQTT BrokerにTopicをSubscribeする
シーメンス#S7-1500でMQTT BrokerにデータをPublishする

TLS

TLSとは?

MQTT Library?

MQTT Communications Libraryは、MQTT BrokerにPub/Subタイプのメッセージ交換に使用されるソフトウェア機能を使用できるライブラリです。

このライブラリは、バージョン3.1.1のMQTTプロトコルをサポートしています。

MQTT Communications Library使用すると、このような機能を実装できます:

  • MQTT Brokerと接続
  • Subscriberとして、ネットワークにあるPublisherから情報を受信する。
  • Publisherとして、ネットワークにあるSubscriberに情報を送信する。
  • MQTT Brokerとの通信と応答時間の確認

  

Install

Omron HPからMQTT Communication libraryをDownloadし、EXEを起動します。

https://www.fa.omron.co.jp/product/tool/sysmac-library/

言語を選び>OKで続きます。

Next>で進みます。

ライセンス同意し、Next>で進みます。

Next>で進みます。

Install!

しばらく待ちます…

Done!

Method

次は今回記事では使用されるFunction BlockとDUTとを紹介します。

DUT

sConnectionSettings

NameData TypeDescription
IpAdrSTRING[201]BrokerのIPアドレス
PortNoUINTBorkerのPort番号
TLSUseBOOL1=TLS使用
TLSessionNameSTRING[17]TLS session 名
UserNameSTRING[256]LoginするときのUsername設定
PasswordSTRING[256]LoginするときのPassword設定
WillCfgsWillCfgWill パラメータ設定
CleanSessionBOOL1=Sessionクリア

sWillCfg

NameData TypeDescription
WillTopicSTRING[512]Will Topic名
WillMsgSTRING[256] Will Message
WillRetainBOOL1=MessageがRetainする
WillQoSBYTEQoS レベル(0,1,2)
WillFlagBOOL1=Will機能有効

MQTTClient

こちらのFunction BlockはNX CPUとMQTT BrokerをConnectionを作成します。MQTTClientが実行成功し、INOUT パラメータであるClientReferenceを MQTTPubAryByte, MQTTSubAryByte, MQTTSubString, MQTTPing のFunction Blockを渡していくのイメージです。

Input Variables

Variable Data typeDescription
Enable BOOL True=接続開始
ClientID STRING[256]MQTT Brokerに識別させるうための識別子
ConnectionSettings sConnectionSettingsMQTT Brokerに接続するパラメータ
KeepAlive UINT KeepAlive 時間設定0-65535
Timeout UINT Timeout設定(0-20s)
DiscardMsgTime UINT受信したメッセージが破棄されるまでの待ち時間の最大値を指定します。

Output Variables

Variable Data typeDescription
Connected BOOLTrue=Brokerと接続中
Busy BOOLTrue=Function Block 実行中
ErrorBOOLTrue=Function Blockエラー発生
ErrorID WORD0=Function Block正常終了、ほかはFunction Blockエラーあり
ErrorIDEx DWORD エラーコードの拡張
DiscardMsgNum UDINT This is the number of discarded message receptions
SessionPresentBOOLTrue=Sessionがある

VAR_IN_OUT

ClientReferencesClientReferenceMQTT FB間で共用するデータです。

MQTTPubAryByte

このFunction BlockはBYTE 配列で指定されたメッセージの PUBLISH メッセージをMQTT ブローカ、に送信する。

VAR_IN

NameTypeDescription
Execute BOOL 立ち上げでFunction Block実行
MsgSize UINT パラメータPubMsgのPublishメッセージのサイズ(Byte)
PubSettings sPubFlagsPublishするときのRetainやQoS設定
Topic STRING[512]PublishするTopic名
TimeOutUINT Timeout設定

VAR_OUT

NameTypeDescription
Done BOOL True=実行成功
Busy BOOLTrue=Function Block 実行中
ErrorBOOLTrue=Function Blockエラー発生
ErrorID WORD0=Function Block正常終了、ほかはFunction Blockエラーあり
ErrorIDEx DWORD エラーコードの拡張

VAR_IN_OUT

NameTypeDescription
ClientReferencesClientReferenceMQTT FB間で共用するデータです。
PubMsgARRAY[*] OF BYTEBrokerに送信するMessage
MsgSize UINT パラメータPubMsgのPublishメッセージのサイズ(Byte)
PacketIDUINT実行開始時にのときに0以外の数値が指定された場合、指定されたパケットIDの再送メッセージとして送信されます。
MsgTypeUSINTQoSレベルが1または2で、なおかつPacketIDが0でない場合にそのパラメータにアクセスされます。0=PUBLISH、1= PUBREL

MQTTPubString 

このFunction Blockは文字列で指定されたメッセージの PUBLISH メッセージをMQTT ブローカ、に送信する。

VAR_IN

NameTypeDescription
Execute BOOL 立ち上げでFunction Block実行
PubSettings sPubFlagsPublishするときのRetainやQoS設定
Topic STRING[512]PublishするTopic名
TimeOutUINT Timeout設定

VAR_OUT

NameTypeDescription
Done BOOL True=実行成功
Busy BOOLTrue=Function Block 実行中
ErrorBOOLTrue=Function Blockエラー発生
ErrorID WORD0=Function Block正常終了、ほかはFunction Blockエラーあり
ErrorIDEx DWORD エラーコードの拡張

VAR_IN_OUT

NameTypeDescription
ClientReferencesClientReferenceMQTT FB間で共用するデータです。
PubMsgARRAY[*] OF BYTEBrokerに送信するMessage
MsgSize UINT パラメータPubMsgのPublishメッセージのサイズ(Byte)
PacketIDUINT実行開始時にのときに0以外の数値が指定された場合、指定されたパケットIDの再送メッセージとして送信されます。
MsgTypeUSINTQoSレベルが1または2で、なおかつPacketIDが0でない場合にそのパラメータにアクセスされます。0=PUBLISH、1= PUBREL

MQTTSubAryByte

こちらのFunction Blockは入力パラメータEnable=TrueでBrokerにTopicをByte配列としてSubscribeを開始します。

VAR_IN

NameTypeDescription
Enable BOOL 1=TopicにSubscribeする
Topic STRING[512]SubscribeするTopic名
SubQoSBYTE QoSを設定します。(0,1,2)
TimeOutUINT Timeout設定

VAR_OUT

NameTypeDescription
Subscribed BOOL 1=TopicにSubscribeした
StatusSINTScbscribeの状態です。0:実行停止中1:Scbscribeを要求中2:Scbscribe中3:Scbscribeをストップする4:Brokerの再接続待ち
ReceivedBOOL1=Messageが受信した
MsgSizeUINT受信したデータサイズ(Byte)
RcvTopicSTRING[512]受信したTopic
ErrorBOOLTrue=Function Blockエラー発生
ErrorID WORD0=Function Block正常終了、ほかはFunction Blockエラーあり
ErrorIDEx DWORD エラーコードの拡張

VAR_IN_OUT

NameTypeDescription
ClientReferencesClientReferenceMQTT FB間で共用するデータです。
RcvMsgARRAY[*] OF BYTE受信したデータを格納先

MQTTSubString 

こちらのFunction Blockは入力パラメータEnable=TrueでBrokerにTopicを文字列としてSubscribeを開始します。

VAR_IN

NameTypeDescription
Enable BOOL 1=TopicにSubscribeする
Topic STRING[512]SubscribeするTopic名
SubQoSBYTE QoSを設定します。(0,1,2)
TimeOutUINT Timeout設定

VAR_OUT

NameTypeDescription
Subscribed BOOL 1=TopicにSubscribeした
StatusSINTScbscribeの状態です。0:実行停止中1:Scbscribeを要求中2:Scbscribe中3:Scbscribeをストップする4:Brokerの再接続待ち
ReceivedBOOL1=Messageが受信した
RcvTopicSTRING[512]受信したTopic
ErrorBOOLTrue=Function Blockエラー発生
ErrorID WORD0=Function Block正常終了、ほかはFunction Blockエラーあり
ErrorIDEx DWORD エラーコードの拡張

VAR_IN_OUT

NameTypeDescription
ClientReferencesClientReferenceMQTT FB間で共用するデータです。
RcvMsgARRAY[*] OF BYTE受信したデータを格納先

MQTTPing

こちらのFunction BlockはMQTT BrokerにPingメッセージを送信し返答時間を測定することができます。

VAR_IN

NameTypeDescription
Enable BOOL 1=TopicにSubscribeする
TimeOutUINT Timeout設定

VAR_OUT

NameTypeDescription
Done BOOL 1=FB実行成功
BusyBOOL1=FB実行中
ElapseTimeUINTPINGREQパケットを送信してからPINGRESPパケットを受信するまでの時間
ErrorBOOLTrue=Function Blockエラー発生
ErrorID WORD0=Function Block正常終了、ほかはFunction Blockエラーあり
ErrorIDEx DWORD エラーコードの拡張

VAR_IN_OUT

NameTypeDescription
ClientReferencesClientReferenceMQTT FB間で共用するデータです。

Implementation

Import the library

Sysmac Studioを起動し、ライブラリをプロジェクトにImportします。

Project>Library>Show Referencesをします。

+ボタンをクリックします。

先程Downloadしたライブラリを選び、Openします。

無視でOKです。

Done!MQTT LibraryがImportされました。

Configuration

Controller Setup>Built-in EtherNet/IP Settingsを開き、TCP/IP SettingのTabからMQTT Brokerと接続してるPortのIPを設定しましょう。

Program

DUT

DUT_MQTT_Basic

DUT_MQTT_Client

DUT_MQTT_Sub

DUT_MQTT_Ping

DUT_MQTT_Pub

VAR

Variables NameTypeDescritpion
bDummyBOOL
bAlwaysONBOOL
pubFlagssPubFlagsBrokerにMessageをPublishする設定
rcvMsgARRAY [0..999] OF BYTEBrokerに受信したByte配列の格納先
RcvTopicSTRING[512]Brokerに受信したのTopic名格納先
SubMessageSTRING[1986]Brokerに受信した文字列データ格納先
MyStringSTRING[255]
pubMsgARRAY[0..999] OF BYTEBrokerにPublishするByte配列データ
StringToAry_DataConvertedUINTをデータ変換Buffer
MQTTPubStringMQTTPubStringBrokerに文字列データをPublishするのFB Instance
PubMessageSTRING[1986]BrokerにPublishする文字列データの格納先
MQTTClientMQTTClientBrokerと接続するFB Instance
bMQTTConnectBOOL1=MQTT Brokerと接続
ClientDUT_MQTT_ClientFBのパラメータ変数
MQTTSubAryByteMQTTSubAryByteBrokerにMessageをSubscribe FB Instance
SubAryByteDUT_MQTT_SubFBのパラメータ変数
MQTTPingMQTTPingBrokerにPingする FB Instance
MQTTSubStringMQTTSubStringBrokerにMessageをSubscribe FB Instance
PingDUT_MQTT_PingFBのパラメータ変数
SubStringDUT_MQTT_SubFBのパラメータ変数
PubAryByteDUT_MQTT_PubFBのパラメータ変数
MQTTPubAryByteMQTTPubAryByteBrokerにPublishするByte配列データの格納先
pubStringDUT_MQTT_PubFBのパラメータ変数
Result_SubAryByteDINT
Result_SubStringDINT

Rung0

Rung Commentをまとめます。

Rung1

MQTT Brokerと接続するパラメータを設定します。

Rung2

MQTT Brokerと接続するTLS パラメータを設定します。

Rung3

WillCfg設定を行います。

Rung4

CleanSessionオプションを有効します。

Rung5

Omron NX CPUがメッセージ PublishするときのQosとRetain設定です。

Rung6

OMRON NX CPUのEthernet Portが正常、なおかつMQTT Functionが実行してない・エラーが発生してないときをbMQTTConnectをTrueします。そのbMQTTConnectはMQTTClientのFunctionのパラメータです。

Rung7

Dummy回路でRung Commentをまとめます。

Rung8

MQTTClient Function Blockを呼び出し、MQTT Brokerと接続します。

Rung9

MQTT ClientがBrokerと接続OKなおかつエラーが発生しないなら自動的にBrokerにTopicをSubscribeします。

Rung10

MQTTSubAryByte Function Blockを呼び出しBrokerからTopci PLCNEXT/Node/Data/Node1をSubscribeします。

Rung11

新しいMessageを受信した場合、データをAryToString関数を使ってByte配列を文字列に変換し、そして文字列をDINTに再変換します。

Rung12

MQTTPing Function Blockを使用しNX CPUとBrokerの通信状態を確認します。

Rung13

MQTTSubString Function Blockを呼び出しBrokerからTopci PLCNEXT/Node/Data/Node1をSubscribeします。

Rung14

新しいMessageを受信した場合、データをAryToString関数を使って文字列をDINTに変換します。

Rung15

NX CPUがBrokerと接続してるときPublishするMessage値を書き込みます。

Rung16

MQTTPubAryByte Function Blockを呼び出しMessageをBrokerにPublishします。

Rung17

MessageをPublishしたらトリガーデバイスをリセットします。

Rung18

NX CPUがBrokerと接続してるときPublishするMessage値を書き込みます。

Rung19

MQTTPubString Function Blockを呼び出しMessageをBrokerにPublishします。

Rung20

MessageをPublishしたらトリガーデバイスをリセットします。

Result

Done!Client.ConnectedがTureになり、NX CPUがBrokerと接続しました。

Subscribe

Omron NX CPUはMQTT Brokerに”PLCNEXT/Node/Data/Node1”をSubscribeしました。

ではPLCNEXT側でデータをPublishしてみますね。

SubAryByte.MsgSize=5、つまり5Bytesのデータを受信しました。

そしてRevTopicから受信したTopicを確認できます。

データ12345を受信しました。

MQTTSubString Function BlockでRevTopicから受信したTopicを確認できます。

同じく、データ12345を受信しました。

Publish

今度MQTTPubAryBytePublishのExecute Flagをトリガーし、Omron NX CPUからデータをPLCNEXTのBrokerに送信します。

Done!PLC NEXT Brokerを7891受信しました。

次はMQTTPubStringのExecuteをトリガーし文字列データをPLC NEXT Brokerにデータを送信します。

Done!PLC NEXT Brokerを8922番号受信しました。

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする