シーメンス#S7-1500でMQTT BrokerにデータをPublishする

今回はS7-1500を使って、LinuxがBrokerを立ち上げて、データをPublishしてみます。

Broker

前のPostでBrokerのセットアップ手順を簡単に紹介しましたが、PLCと繋がるにはもう少しLinux側で工夫する必要があります(自分がVMでUbuntu走るので)。

MQTT#Brokerのセットアップ

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で説明します。

https://support.industry.siemens.com/cs/document/109748872/fb-lmqtt_client-for-simatic-s7-cpu?dti=0&lc=en-MW

“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ダウンロードできます。

https://support.industry.siemens.com/cs/document/72341852/support-packages-for-the-hardware-catalog-in-the-tia-portal-(hsp)?dti=0&lc=en-WW

ちなみに、S7-1200 FW4.3のHSP番号はHSP0276です。

結局

最後はプロジェクト上でS7-1200をFW4.3に変更し無事にライブラリをインストールできました。が、実機はまだFW4.2ままで、S7-1200のFirmwareダウンロードしようとすると…

https://support.industry.siemens.com/cs/document/109763919/firmware-version-v4-3-released-for-s7-1200?dti=0&lc=en-CZ

私のアカウントではダウンロードできませんって言われました。ここで一回諦めS7-1500でやります。

プログラム

これからプログラムします。前にも書きましたが、必要なのはこのLMQTT_Clientです。

パラメータはほぼ構造体なので、いちいち説明するのは凄く時間かかりますからパラメータのDBを作りながら説明したいと思います。

publishData

名前通り、LMQTT_ClientがデータをPublish(いわゆる送信)するとき参照するパラメータリストです。Add new block>Type>LMQTT_typePublishDataに選び、わかりやすい名前を入力し、OKします。

こちらは各パラメータの説明です:

NameTypeComment
publishMessageBoolTrue=メッセージを送信する
publishTopicWString[250]送信するTopic
publishMessageDataWString[1500]送信するメッセージ
publishQosIntQuality of Servic0=届いたどうかも確認しない1=最低でも一回届くように2=正確に一回届くように
publishRetainFlagboolTrue=Messageはサーバーに保存する

SubscribeToTopic

名前通り、LMQTT_ClientがデータをSubscribe(いわゆる通信)するとき参照するパラメータリストです。Add new block>Type>LMQTT_typeSubscribeDataに選び、わかりやすい名前を入力し、OKします。

こちらは各パラメータの説明です:

NameTypeComment
subscribeToTopicBoolTrue=Topicを通信ようにする
unsubscribeFromTopicBoolTrue=Topicを通信しないようにする
subscriptionTopicWString[250]通信するTopic
sbscriptionQosIntQuality of Servic0=届いたどうかも確認しない1=最低でも一回届くように2=正確に一回届くように

tcpConnParam

LMQTT_ClientがBrokerと接続するとき参照するパラメータリストです。
Add new block>Type>LMQTT_typeTcpConnParamDataに選び、わかりやすい名前を入力し、OKします。

NameTypeComment
useQdnBoolQdnを使うかどうか
hwIdentifierHW_ANYCPUがMQTTサーバーと接続してるLAN PortのID。
connectionIDCONN_OUCCPUがTCP/IPを使うときの独立のID
qdnAddressBrokerWString[254]Brokerのアドレス、IPならそのままIP入れてください。
ipAddressBrokerArray[0..3]of USINTBrokerのIPアドレスです。192.168.11.1ならipAddressBroker[0]=192..のように。
localPortUINTCPUのPortです。0なら空きPortを勝手に使います。
mqttPortUINTBrokerの使用Port。今回はSecurityなしでやりますので、1883にします。
activateSecureConnbool今回Security使わないので、Defaultのまま
validateSubjectAlternate
NameOfServer
Bool今回Security使わないので、Defaultのまま
idTlsServerCertificateUDInt今回Security使わないので、Defaultのまま
idTlsOwnCertificateUDInt今回Security使わないので、Defaultのまま

mqttParam

LMQTT_ClientがBrokerと接続するとき参照するもう1つのパラメータリストです。
Add new block>Type>LMQTT_typeParaDataに選び、わかりやすい名前を入力し、OKします。

NameTypeComment
ConnectFlagLMQTT_typeConnectFlagsMQTT Brokerと繋がってるときにの設定Flag
.cleanSessionBoolTrue=前回のSessionのデータすべて削除
.willBoolTrue=Will(遺言)する
.willQoS1BoolTrue=Qos Level1 Will(遺言)する
.willQoS2BoolTrue=Qos Level2 Will(遺言)する
.willRetainBoolTrue=最後のデータはラッチする
.passwordString[100]今回Security使わないので、Defaultのまま
.userNameString[100]今回Security使わないので、Defaultのまま
keepAliveUInt0=KeepAliveしない
clientIdentifierString[23]MQTTにどんなClient接続してるかを確認できるの独立のID
willTopicString[100]Will(遺言)のTopic
willMessageString[100]Will(遺言)のMessage
userNameString[100]今回Security使わないので、Defaultのまま
passwordString[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されいます。

お疲れ様ですー。

こちらはサンプルプログラムです:

https://github.com/chwAmu/Siemens_TIA/tree/master/IoT

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

シェアする

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

フォローする