今回はTF6730・TF6735を使用しPLCのデータをPublishし、アンドロイドやIPHONEから表示できるように説明します。意外と詰まるところもあります…汗
TF6730/TF6735
Tc3_IoTCommunicatorというFunction Blockを使用しデータをLocalのTwinCAT PLCシステムと携帯をMQTT経由で”つながる”ことができます。そこでSend/Receiveデータは生のBinaryデータではなくちゃんとした意味持つ、人間が読めるデータです。
TF6730:TwinCAT PLC(ライセンス必要、7日無料、まぁ、みんなも知っていますね。)
TF6735:携帯アプリケーション側(無料)
Manual
System Requirment
Function Blocks
VAR_INPUT
sClientId | STRING | 空文字列であればSystemが自動作成します。 |
sHostName | STRING | BrokerのURLです。 |
nHostPort | UINT | Default1883ですが、TLS使用する場合は8883になります。 |
sMainTopic | STRING | |
sDeviceName | STRING | デバイス名、アプリでつながるとき使う |
sUserName | STRING(255) | Broker接続するときUsername(オプション) |
sUserPassword | STRING(255) | Broker接続するときPassword(オプション) |
stTLS | ST_IotMqttTls | TLS-secured connectionでBrokerと接続するなら設定する必要があります。(オプション) |
eQoS | TcIotMqttQos | |
bRetain | BOOL | メッセージ保存するか |
VAR_OUTPUT
bError | BOOL | FBがエラー発生するとTrueになります。 |
hrErrorCode | PVOID | エラーCode |
eConnectionState | ETcIotMqttClientState | いまの接続状態 |
bConnected | BOOL | Brokerと接続したかどうか |
fbCommand | FB_IoTCommand | このコマンド使用し携帯アプリケーションとやり取りします。 |
Method
Execute
このMethodは周期でCallする必要があります。
VAR_INPUT
bConnect | BOOL | 1=接続する |
SendData
BrokerへDataを送るときに呼び出す必要なMethodです。
戻り値=TrueならData送信成功です。
VAR_INPUT
pMachineStruct | PVOID | DataのMemory Pointer |
nStructSize | UINT | Dataのサイズ |
SendMessage
BrokerMessageを送るときに呼び出す必要なMethodです。
戻り値=TrueならData送信成功です。
VAR_INPUT
sMessage | STRING(255) |
FB_IotCommand
このFunction BlocksはFB_IotCommunicatorの一部で、携帯アプリケーションとやり取りに必要なMethodやそのStatusを提供しています。
bError | BOOL | FBがエラー発生するとTrueになります。 |
hrErrorCode | PVOID | エラーCode |
bAvailable | BOOL | 1=新しいコマンドあり、つまり携帯からなにか操作した |
sVarName | STRING | その操作された変数名 |
GetValue
このMethodは操作された変数名を取得します。
pValue | PVOID | 変数のMemory Pointer |
nSize | UDINT | その変数のSize |
eDatatype | E_IotCommunicatorDatatype | 変数のデータType |
Remove
このMethodは操作された変数名とそのコマンドを削除します。
戻り値=TrueならRemove()が成功しました。
変数Attribute
実装
今回はRaspberryでMQTT Brokerをインストールし、TwinCAT RuntimeでTF6730を使用しDataをEtherNet CableつながってるRaspberryにPublishします。アンドロイドの携帯はBeckhoffのアプリTF6735 Communicatorを使用し、Wirelessに接続してるRaspberryにMessageをPublish/Subscribeします。
最後はTF6100でOPCUAを使用しFactoryIOと連携します。
Raspberry Setup
昔にもいくつの記事書いてたことがあります。以下に詳しく書いています:
Broker側
SSHからRaspberryをLoginし、以下のコマンドでMqtt Brokerをインストールします。
sudo apt install mosquitto |
Mqtt Brokerを起動します。
sudo systemctl start mosquitto |
Mqtt Brokerの状態を確認します。
sudo systemctl status mosquitto |
いまはActive runningの緑文字が表示されたらOKです。
Client側
これはMustではないですが、まずLocalからMessageをPublish/SubscribeできるかどうかをCheckしたほうがよいだと思います。
以下のコマンドでClientをインストールします。
sudo apt install mosquitto-clients |
今度はTopicをSubscribeします。
hはHostnameでtはTopicです。
mosquitto_sub -h localhost -t “test/p1” |
もうひとつのSSHを起動し先Subscribeしたを確認します。
mosquitto_pub -h localhost -t “test/testp1” -m “Hello!” |
TwinCAT側
Raspberry側OKなら次はTwinCATの方ですね。
ライブラリ追加
Reference>Add libraryします。
FB_IotCommunicatorを検索し、OKで追加します。
これで追加OKです。
DUT
構造体を作成します。なぜかというと、先程も書いてた通り、TF6735は変数のAttributeを参照しなにか携帯のアプリケーション上に表示するかを決めます。
一つ一つ追加するより、DUTで定義しまとめで作成したほうがよいですし、Function BlockのSendDataなどのMethodにもその構造化された変数パラメータが必要になります。
なので…作りましょう。
わかりやすい名前でOKです。
今回はBoolを3つ・整数を一つを定義します。
TYPE DUT_MyData : STRUCT {attribute ‘iot.DisplayName’ := ‘LEDTower1 Green’} bTowerGreen :BOOL; {attribute ‘iot.DisplayName’ := ‘LEDTower1 Yellow’} bTowerYellow :BOOL; {attribute ‘iot.DisplayName’ := ‘LEDTower1 Reg’} bTowerRed :BOOL; {attribute ‘iot.DisplayName’ := ‘Box Counter’} {attribute ‘iot.ReadOnly’ := ‘false’} {attribute ‘iot.Unit’ := ‘pieces’} {attribute ‘iot.MinValue’ := ‘0’} {attribute ‘iot.MaxValue’ := ’99’} iBoxCounter :int; END_STRUCT END_TYPE |
PROGRAM
プログラムの考え方は昔書いてたBeckhoff MQTTの記事と似ていますので、ここで詳しく説明しません。以下の記事で参考してください:
VAR
VAR IotCommunicator:FB_IotCommunicator; bee:BOOL; TON:ARRAY[0..1]OF ton; {attribute ‘OPC.UA.DA’ := ‘1’} myData:DUT_MyData; iCounter:INT; iCounter2:int; END_VAR |
VAR CONSTANT
VAR CONSTANT cReflashTime:TIME:=T#3S; END_VAR |
Code
ここで注意するPOINTは3つがあります。
1.sMainTopicは後ほどの携帯アプリで使うので、覚えておいてください。
2.MQTTのProtocolは現状で3s一回更新するですが、実際によって短く変更しても構いません。
3.iotCommunicator.fbCommand.bAvailableがTrueになってたときは、アプリケーションからなにかの操作したタイミングです。そしてsVarName()で変数名をもらい、GetValue()で値を更新する。最後はRemove()でコマンドをクリアします。
// iotCommunicator.sHostName:=’192.168.1.53′; iotCommunicator.sClientId:=’TwinCAT Local System1′; iotCommunicator.sMainTopic:=’test’; iotCommunicator.sDeviceName:=’MyMachineStation1′; TOn[0]( in:=NOT ton[0].Q ,PT:=cReflashTime ); iotCommunicator.Execute(TRUE); IF iotCommunicator.bConnected AND TON[0].Q THEN IF iotCommunicator.SendData( ADR(myData) ,SIZEOF(myData) ) THEN iCounter:=iCounter+1; END_IF; END_IF IF iotCommunicator.fbCommand.bAvailable THEN IF iotCommunicator.fbCommand.sVarName=’bTowerGreen’ THEN iotCommunicator.fbCommand.GetValue( ADR(myData.bTowerGreen) ,SIZEOF(myData.bTowerGreen) ,E_IotCommunicatorDatatype.type_BOOL); END_IF IF iotCommunicator.fbCommand.sVarName=’bTowerYellow’ THEN iotCommunicator.fbCommand.GetValue( ADR(myData.bTowerYellow) ,SIZEOF(myData.bTowerYellow) ,E_IotCommunicatorDatatype.type_BOOL); END_IF IF iotCommunicator.fbCommand.sVarName=’bTowerRed’ THEN iotCommunicator.fbCommand.GetValue( ADR(myData.bTowerRed) ,SIZEOF(myData.bTowerRed) ,E_IotCommunicatorDatatype.type_BOOL); END_IF IF iotCommunicator.fbCommand.sVarName=’iBoxCounter’ THEN iotCommunicator.fbCommand.GetValue( ADR(myData.iBoxCounter) ,SIZEOF(myData.iBoxCounter) ,E_IotCommunicatorDatatype.type_INT); END_IF iotCommunicator.fbCommand.Remove(); END_IF |
テスト
最初に自分もTF6730がどんなTopicをPublishするかわかりませんので、 ”#”ですべてのTopicをSubscribeします。
GroupNameはMyMachineName1ですね。つまりGroupName=sDeviceNameですね。
念の為、test/MyMachineStation1/#でもう1度確認しましょう。
よし、同じなData帰ってきましたね。それでOK。
携帯側
自分はアンドロイドしかもっていません。ごめんさい。でもIOSも同じな操作だと思いますので大丈夫だよね。
Google Play StoreからBeckhoffを検索します。
TwinCAT Iot Communicatorをインストールします。
携帯とRaspberry間でWireless繋がります。
アプリケーションを起動し、SETTINGS TABからBroker AddressやPortなどを設定します。
TopicがsMainTopicと同じく設定してください。そうしなとConnect>すぐDisconnectのことになります。
もし一回つながって、そのあとTwinCAT RuntimeがStopになったら、DEVICES TabからOffline表示されています。Brokerとつながってないので当然ですね。
TwinCATのRuntimeがRunになるとOnlineに変わります。それでOKです。
FactoryIO側
最後はFactoryIO側ですね。制御盤の上にLED Townerを置き、あと数字表示もご一緒にに。
DriverをOPCUAを設定し、Tagを割り付けましょう。
もし不明な方いれば以下の記事を参考してください:
結果
携帯とFactoryIOとTwinCATの連携は完璧ですね!
以下はサンプルプロジェクトダウンロードできます。
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT%20Project_TF6730_TF6735.tnzip
最後
はーい、お疲れ様です。
もしなにか質問あれば、メール・コメント・Twitterなどでもどうぞ!
Twitterのご相談:@3threes2
メールのご相談:soup01threes*gmail.com (*を@に)