Beckhoff#TwinCAT TF6701 AWS IOT CoreにMessage Publishする

TF6701とは?

今回はTF6701を使ってAWS IOT Core BrokerにMessageをPublishします。TF6701を使えばMQTTを使ってBrokerと接続できます。BrokerはLocalなものだけではなくCloud ServicesのAWS・Google・MS Azureなども可能です。


Manual

下記のLinkでManualをダウンロードしてください。

Manualはいつもあなたの友達です。

https://download.beckhoff.com/download/Document/automation/twincat3/TF6701_TC3_IoT_Communication_MQTT_EN.pdf

System Requirement

ちなみにTF6701は別途のインストール必要ないです。

使用パッケージ

今回はTF6701だけですが、次はTF6720でも紹介したいと思います。

AWS IoT Core は、インターネットに接続されたデバイスから、クラウドアプリケーションやその他のデバイスに簡単かつ安全に通信するためのマネージド型クラウドサービスです。 AWS IoT Core では数十億個のデバイスと数兆件のメッセージをサポートしており、それらのメッセージを AWS エンドポイントや他のデバイスに確実かつセキュアに処理してルーティングします。AWS IoT Core を使用すれば、アプリケーションがインターネットに接続されていない場合でも、すべてのデバイスを常に追跡して通信できます。

AWS IOT Core構築

詳しくはこちらの記事を参考してください。

SiemensのC712構築説明のものですが、AWSのあたりは同じです。

シーメンス#S7-1500とCC712でAws IOT Coreを繋がりましょう

Function Block

今回はTc3_IotBaseのFB_IotMqttClient Function Blockを使用しAWS IOT Coreと接続すると考えています。

TF6701の中にあるFB_IotMqttClientを使えば、TwinCAT Runtimeを簡単にLocal・Cloud Brokerと繋がれます。

VAR_INPUT

sClientIdSTRING(255)このClient IDはAWS IOT Coreだと”Things”の名前に該当します。
sHostNameSTRING(255)BrokerのURLです。AWS IOT CoreだとEndpointです。
nHostPortUINTDefault1883ですが、TLS使用する場合は8883になります。
sTopicPrefixSTRING(255)すべてのPublish・Subscribeするときに自動追加されるCommand
nKeepAliveUINTWatchdog時間(s)
sUserNameSTRING(255)Broker接続するときUsername(オプション)
sUserPasswordSTRING(255)Broker接続するときPassword(オプション)
stWillST_IotMqttWillBrokerと接続切れたときになに”遺言”をするか
stTLSST_IotMqttTlsTLS-secured connectionでBrokerと接続するなら設定する必要があります。
ipMessageFiFoI_IotMqttMessageFiFoFB_IotMqttMessageQueueのインスタを割り付けできます。(これはちょっとわからない)

ST_IotMqttWill

このDUTはMessageはQos・Payloadなどの設定ができます。

sTopicSTRING(255)MessageのTopic
pPayloadPVOIDPayloadのアドレス
nPayloadSizeUDINTPayloadのByte数
eQoSTcIotMqttQosQos(Quality of Service)のLevel設定になります。
bRetainBOOLTrueだとBrokerはデータを順番で保存します。

ST_IotMqttTls

MQTTのTLS security設定になります。

CA(certificate authority)・PSK(PreSharedKey) が使用できます。

sCASTRING(255)certificate authority (CA)のPath
sCertSTRING(255)Client certificateのPath
sKeyFileSTRING(255)ClientのPrivate Key Path
sKeyPwdSTRING(255)そのPrivate KeyのPassword(オプション)
sCrlSTRING(255)certificate revocation listのPath
sCiphersSTRING(255)
sVersionSTRING(80)TLSのバージョン。‘tlsv1’・ ‘tlsv1.1’・‘tlsv1.2’・‘tlsv1.3’
bNoServerCertCheckBOOLServer証明書の有効性Checkするか
sPskIdentitySTRING(255)TLS PSK 接続のPreSharedKey identity
aPskKeyARRAY[1..64] OF BYTETLS PSK 接続のPsk Key
nPskKeyLenUSINTそのPsk keyのByte数
sAzureSasSTRING(511)Microsoft Azure IoT Hub接続のときに使う

VAR_OUTPUT

bErrorBOOLFBがエラー発生するとTrueになります。
hrErrorCodePVOIDエラーCode
eConnectionStateETcIotMqttClientStateいまの接続状態
bConnectedBOOLBrokerと接続したかどうか

Method

Execute

このMethodは周期でCallする必要があります。

VAR_INPUT

bConnectBOOL1=接続する

Publish

MQTT BrokerにPublish動作するMethodです。

VAR_IN

sTopicSTRINGPushlishのTopic
pPayloadPVOIDMQTT Messageのアドレス
nPayloadSizeUDINTPayloadのサイズ
eQoSTcIotMqttQosQosの設定
bRetainBOOL
bQueueBOOLSpare

RETRUN

PublishBOOL1=Publish成功

Subscribe

BrokerからTopicのSubscription用のMethodです。今回は使用しないので、次回説明します。

Unsubscribe

Subscriptionを削除するMethodです。

VAR_INPUT

sTopicSTRINGSubscriptionを削除するTopicです。

Return

UnsubscribeBOOL1=Unsubscribe成功

ActivateExponentialBackoff

Backoff 機能使用するMethodです。使うときまた説明します。

DeactivateExponentialBackoff

Backoff 機能不使用するMethodです。使うときまた説明します。


実装

説明は長くなりました。これからは実装するプログラムなどを説明します。

Library追加

TwinCAT ProjectからReferences>Add libraryします。

Tc3_IotBaseを検索し、OKで追加します。

同じく、Tc2_Utilitiesを検索し、OKで追加します。

Program

次はプログラム作成ですね。やってるのはまずパラメタ設定で(証明書・Private Key・EndPoint、Port、Clientid、そしてMqttClientを呼び出しAWS IOT Coreと接続し、最後はMessageをPublishします。

VAR

ここで必要な変数を定義します。

VAR
MqttClient :FB_IotMqttClient;
bPublish :BOOL:=FALSE;
sTopicEmail :STRING(255) := ‘TwinCAT/TF6701/Devices1’;
bSend :BOOL;
sPayloadEmail :STRING(255) := ‘{“default”: “Hello from TwinCAT”,”message”: “Hello from TwinCAT”}’;
bConnect :BOOL;
bsetPars :BOOL;
icoun :INT;
MessageQueue :FB_IotMqttMessageQueue;

END_VAR

MAIN

MqttClient.nHostPortはAWS IOT CoreのEndpoint URLです。

MqttClient.nHostPortはMQTT TLS Seure使用しますので8883にしてください。

MqttClient.sClientIdはAWS IOT Coreの”Things”の名前です。

sCertやsKeyFileは”Things”作成したときダウンロードしたものです。

IF bsetPars THEN
MqttClient.stTLS.sCA:=’c:\Cert\aws\AmazonRootCA1.pem’;
MqttClient.stTLS.sCert:=’c:\Cert\aws\ccf8d8b84f-certificate.pem.crt’;
MqttClient.stTLS.sKeyFile:=’c:\Cert\aws\ccf8d8b84f-private.pem.key’;
MqttClient.sHostName:=’a30hlb7uyo754j-ats.iot.us-east-2.amazonaws.com’;
MqttClient.nHostPort:=8883;
MqttClient.sClientId:=’mythings’;
MqttClient.ipMessageQueue:=MessageQueue;
MqttClient.sTopicPrefix:= ”;
END_IF;

MqttClient.Execute(bConnect:=bConnect);
IF MqttClient.bConnected THEN
icoun:=icoun+1;

END_IF

IF  bPublish  THEN
MqttClient.Publish(
sTopic:= sTopicEmail
,pPayload:= ADR(sPayloadEmail)
,nPayloadSize:=LEN2(ADR(sPayloadEmail))
,eQoS:= TcIotMqttQos.AtMostOnceDelivery
,bRetain:= FALSE
,bQueue:= FALSE);
bPublish:=False;
END_IF

結果

AWS Iot Core Consoleを開いて、Test>Subscribe to a topicで

TwinCAT/TF6701/Devices1を入力し、Subscribeします。

bPublishをTrueしますと。ここでPushlishされたメッセージが見えます!

Sampleプロジェクト

https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT%20Project1_TF6701_aws.tnzip

最後に

もしMQTT_ERR_TLS_CA_NOFOUNDなど出たら大体証明書もPath間違ってるどうか。そういうとき証明書やPrivate keyのPath再確認しましょう。

あとつながるまでずっとMQTT_ERR_NOMEMのStateです。自分の場合はThingsのPolicyちゃんと設定できなかったから繋がりなく、ずっとその状態>Disconnectの繰り返しでした。

https://github.com/eclipse/paho.mqtt.python/issues/392

Qosについて

そういえば、先Function Blockを使ってるときにOosという単語が出てきますね。それについて少し補足説明しますね。

QosはQuality of ServiceでSenderとReceiverの間でメッセージのやり取りの”保証”の設定になります。MQTTは3つのQos Levelがあります:

  • 0:Not more than once
  • 1:At least once
  • 2:Exactly once

Qos0:Not more than once

ReceiverはAckしませんし二回目の送りしません。

Qos1:At least once

Qos1だとシステムはReceiverへが最低限一回Message到達すると保証します。SenderがMessageを内部に保存しReceiverのPUBACK MessageからACKもらうまでです。もしPUBACKが一定時間内にReceiverもらえないのであればSenderがMessageが再送します。

Qos2:Exactly once

Qos2は一番安全なレベルでシステム上でReceiverが一回だけSenderからMessageもらうと保証します。(ですが一番遅い)MQTTではHandShakeを行います。

ReceiverがQos Level2のメッセージもらったら、まずPUBREC MessageでAck を返しします。 Senderは内部でそのメッセージをReceiverからPUBREC もらうまでずっと保存します。Level1と一番大きな違いはQos2はメッセージの再送防止できます。

SenderがReceiverからもrったPUBRECを内部で保存しPUBREL Messageを返しします。そしてReceiverがPUBRELがもらったら、Receiverがいま保存してるStatusをリセットし、PUBCOMPをSenderに返しします。もし途中で通信失敗したら、一定時間内にMessageを再送するようにします。

はーい、お疲れ様です。

もしなにか質問あれば、メール・コメント・Twitterなどでもどうぞ!

Twitterのご相談:@3threes2

メールのご相談:soup01threes*gmail.com (*を@に)

Footer_Basic

Find ME

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

シェアする

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

フォローする