今回はS7-1500を使って、LinuxがBrokerを立ち上げて、データをPublishしてみます。
Broker
前のPostでBrokerのセットアップ手順を簡単に紹介しましたが、PLCと繋がるにはもう少しLinux側で工夫する必要があります(自分がVMでUbuntu走るので)。
PLCと繋がるので固定IPがHost Nameになりますが、今回は固定IPでやりますのでUbuntuのIPを192.168.11.21に設定します。
VMのNetwork connectionをBridgedにします。これで設定OK。
TIA側
こちらは今回の構成です。認証のやり方はまた別のPostで書きます。MQTT Brokerがありまして、S7-CPUがMQTT clientとして存在しConnection parametersというDBで様々な設定を行いFunction Block”LMQTT_Client”はそのDB達を参照しMQTT BrokerにPublishなどの動作します。簡単明瞭です。
ライブラリインストール
シーメンス社ではMQTTのライブラリを提供していますのでひとまず以下のリングでダウンロードおねがいします。ですがライブラリをサポートするTIAバージョンはV15.1以上になりますのでそれ以下のバージョンのやり方はまた別のPOSTで説明します。
“LMQTT_Client” library for STEP 7 V15.1をダウンロードします。
もちろん1.9MBのDocumentationも忘れずに。
Libraryを開くとLMQTT_ClientというFolderがあります。テストするPLCタイプに合わせていれてください。
トラブル
最初はS7-1200でテストしようと思いますが、何回もライブラリを自分のPLCに引っ貼ってもエラーが出てきてTIA無理やり閉じられてしまうという羽目に…TIA Diagnostic Reportを開いて、一応どんなTIAがどんなExceptionでちょっと理由っぼいものが書いています。とりあえず頑張って見てきます。
うん?Stack Traceのところみたらちょっと気になるメッセージがあります。
Can't get MDD fom HWCN for controllertaget
つまりハードウェアのコントローラーになにかもらえないってことですね。MDDってなんだろう…もう少し下みたら、
ConfigObjectTypenName:'S71200\CPU\CPU_12XX\MDD_6ES72XX_XXXXX_XXXX_4.3’
もしかしていまライブラリを引っ貼ろうとするCPUって設定Firmwareが低すぎる?だからエラーが出てきてのかな?確かに自分のS7-1200はV4.2に設定しましたので。
DocumentationでS7-1200で検索してみたらたしかにFirmware制限が書いています!
- S7-1500ならV2.0以上
- S7-1200ならV4.3以上
になります。
だからエラー出ましたのやっばりこの原因かもしれませんね。
そこで、HSP をアップデート!以下のリングでHSPダウンロードできます。
ちなみに、S7-1200 FW4.3のHSP番号はHSP0276です。
結局
最後はプロジェクト上でS7-1200をFW4.3に変更し無事にライブラリをインストールできました。が、実機はまだFW4.2ままで、S7-1200のFirmwareダウンロードしようとすると…
私のアカウントではダウンロードできませんって言われました。ここで一回諦めS7-1500でやります。
プログラム
これからプログラムします。前にも書きましたが、必要なのはこのLMQTT_Clientです。
パラメータはほぼ構造体なので、いちいち説明するのは凄く時間かかりますからパラメータのDBを作りながら説明したいと思います。
publishData
名前通り、LMQTT_ClientがデータをPublish(いわゆる送信)するとき参照するパラメータリストです。Add new block>Type>LMQTT_typePublishDataに選び、わかりやすい名前を入力し、OKします。
こちらは各パラメータの説明です:
Name | Type | Comment |
publishMessage | Bool | True=メッセージを送信する |
publishTopic | WString[250] | 送信するTopic |
publishMessageData | WString[1500] | 送信するメッセージ |
publishQos | Int | Quality of Servic0=届いたどうかも確認しない1=最低でも一回届くように2=正確に一回届くように |
publishRetainFlag | bool | True=Messageはサーバーに保存する |
SubscribeToTopic
名前通り、LMQTT_ClientがデータをSubscribe(いわゆる通信)するとき参照するパラメータリストです。Add new block>Type>LMQTT_typeSubscribeDataに選び、わかりやすい名前を入力し、OKします。
こちらは各パラメータの説明です:
Name | Type | Comment |
subscribeToTopic | Bool | True=Topicを通信ようにする |
unsubscribeFromTopic | Bool | True=Topicを通信しないようにする |
subscriptionTopic | WString[250] | 通信するTopic |
sbscriptionQos | Int | Quality of Servic0=届いたどうかも確認しない1=最低でも一回届くように2=正確に一回届くように |
tcpConnParam
LMQTT_ClientがBrokerと接続するとき参照するパラメータリストです。
Add new block>Type>LMQTT_typeTcpConnParamDataに選び、わかりやすい名前を入力し、OKします。
Name | Type | Comment |
useQdn | Bool | Qdnを使うかどうか |
hwIdentifier | HW_ANY | CPUがMQTTサーバーと接続してるLAN PortのID。 |
connectionID | CONN_OUC | CPUがTCP/IPを使うときの独立のID |
qdnAddressBroker | WString[254] | Brokerのアドレス、IPならそのままIP入れてください。 |
ipAddressBroker | Array[0..3]of USINT | BrokerのIPアドレスです。192.168.11.1ならipAddressBroker[0]=192..のように。 |
localPort | UINT | CPUのPortです。0なら空きPortを勝手に使います。 |
mqttPort | UINT | Brokerの使用Port。今回はSecurityなしでやりますので、1883にします。 |
activateSecureConn | bool | 今回Security使わないので、Defaultのまま |
validateSubjectAlternate NameOfServer | Bool | 今回Security使わないので、Defaultのまま |
idTlsServerCertificate | UDInt | 今回Security使わないので、Defaultのまま |
idTlsOwnCertificate | UDInt | 今回Security使わないので、Defaultのまま |
mqttParam
LMQTT_ClientがBrokerと接続するとき参照するもう1つのパラメータリストです。
Add new block>Type>LMQTT_typeParaDataに選び、わかりやすい名前を入力し、OKします。
Name | Type | Comment |
ConnectFlag | LMQTT_typeConnectFlags | MQTT Brokerと繋がってるときにの設定Flag |
.cleanSession | Bool | True=前回のSessionのデータすべて削除 |
.will | Bool | True=Will(遺言)する |
.willQoS1 | Bool | True=Qos Level1 Will(遺言)する |
.willQoS2 | Bool | True=Qos Level2 Will(遺言)する |
.willRetain | Bool | True=最後のデータはラッチする |
.password | String[100] | 今回Security使わないので、Defaultのまま |
.userName | String[100] | 今回Security使わないので、Defaultのまま |
keepAlive | UInt | 0=KeepAliveしない |
clientIdentifier | String[23] | MQTTにどんなClient接続してるかを確認できるの独立のID |
willTopic | String[100] | Will(遺言)のTopic |
willMessage | String[100] | Will(遺言)のMessage |
userName | String[100] | 今回Security使わないので、Defaultのまま |
password | String[100] | 今回Security使わないので、Defaultのまま |
実装
ではProgram blocksの中にもうDBが4つ追加されましたね。
NTW1
M0.4がONになると、db_publichData.publishMessageDataを該当するTopicにPublishします。
NTW2
Subscribeのプログラムです。M0.2がTrueになると該当するTopicを受信します。
M0.3がTrueになると該当するTopicを受信キャンセルします。
NTW3
もちろん、S7-1500のConnection番号も忘れずに。
NTW4
次はLMQTT_ClientをCallするだけです。
NTW5
Subscribe、Publish成功するたびにdoneが立ち上げる。
テスト
サーバー側でMQTT Broker起動し、TopicをSubscribeします。
mosquitto_sub -h localhost -t SomeTopic/001
enableをOnし、接続成立したら:
データをPublishしてみると、
もちろんDoneがOnになり+1にします。
Subscribeしてる側にもPLCからPublishしたデータが見えます。
思わずの切断(例えばLANを抜いたり)しばらく立つとWill Messageが出てきます。
最後はmqttParamのclientIdentifierが設定した”ClientIdentifier”がServer側にどんな風に見えてるのか。
cat /var/log/mosquitto/mosquitto.log
ちゃんとこの時間でClientIdentifier設定した名前がDissconectedしたとLoggingされいます。
お疲れ様ですー。
こちらはサンプルプログラムです: