Beckhoff#TF6730,TF6735 IotCommunicator使ってみよう

今回はTF6730・TF6735を使用しPLCのデータをPublishし、アンドロイドやIPHONEから表示できるように説明します。意外と詰まるところもあります…汗

TF6730/TF6735

 Tc3_IoTCommunicatorというFunction Blockを使用しデータをLocalのTwinCAT PLCシステムと携帯をMQTT経由で”つながる”ことができます。そこでSend/Receiveデータは生のBinaryデータではなくちゃんとした意味持つ、人間が読めるデータです。

TF6730:TwinCAT PLC(ライセンス必要、7日無料、まぁ、みんなも知っていますね。)

TF6735:携帯アプリケーション側(無料)

Manual

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

System Requirment

Function Blocks

VAR_INPUT

sClientIdSTRING空文字列であればSystemが自動作成します。
sHostNameSTRINGBrokerのURLです。
nHostPortUINTDefault1883ですが、TLS使用する場合は8883になります。
sMainTopic STRING
sDeviceName STRINGデバイス名、アプリでつながるとき使う
sUserNameSTRING(255)Broker接続するときUsername(オプション)
sUserPasswordSTRING(255)Broker接続するときPassword(オプション)
stTLSST_IotMqttTlsTLS-secured connectionでBrokerと接続するなら設定する必要があります。(オプション)
eQoS TcIotMqttQos 
bRetain BOOL メッセージ保存するか

VAR_OUTPUT

bErrorBOOLFBがエラー発生するとTrueになります。
hrErrorCodePVOIDエラーCode
eConnectionStateETcIotMqttClientStateいまの接続状態
bConnectedBOOLBrokerと接続したかどうか
fbCommand FB_IoTCommand このコマンド使用し携帯アプリケーションとやり取りします。

Method

Execute

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

VAR_INPUT

bConnectBOOL1=接続する

SendData

BrokerへDataを送るときに呼び出す必要なMethodです。

戻り値=TrueならData送信成功です。

VAR_INPUT

pMachineStructPVOIDDataのMemory Pointer
nStructSize   UINTDataのサイズ

SendMessage

BrokerMessageを送るときに呼び出す必要なMethodです。

戻り値=TrueならData送信成功です。

VAR_INPUT

  sMessageSTRING(255)

FB_IotCommand

このFunction BlocksはFB_IotCommunicatorの一部で、携帯アプリケーションとやり取りに必要なMethodやそのStatusを提供しています。

bErrorBOOLFBがエラー発生するとTrueになります。
hrErrorCodePVOIDエラーCode
bAvailableBOOL1=新しいコマンドあり、つまり携帯からなにか操作した
sVarNameSTRINGその操作された変数名

GetValue

このMethodは操作された変数名を取得します。

pValuePVOID変数のMemory Pointer
nSizeUDINTその変数のSize
eDatatypeE_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

昔にもいくつの記事書いてたことがあります。以下に詳しく書いています:

MQTT#Brokerのセットアップ
TLSとは?
MQTTはなに?

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の記事と似ていますので、ここで詳しく説明しません。以下の記事で参考してください:

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

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#Beckhoff TwinCAT3と連携しよう

結果

携帯とFactoryIOとTwinCATの連携は完璧ですね!

以下はサンプルプロジェクトダウンロードできます。

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

最後

はーい、お疲れ様です。

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

Twitterのご相談:@3threes2

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

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

シェアする

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

フォローする