Beckhoff#TwinCAT3 TF6340とMicro:bitとシリアル通信しよう

今回はBeckhoff TwinCAT3 TF6340とmicro:bitをシリアル通信してみます。意外と楽しかったです。なぜmicro:bitを使うと言いますと、簡単でDrop&Dragプログラミングできますし3軸の加速センサー・スイッチ・温度センサーついて、シリアル通信経由でそれらの通信を検証できます。そしてやすいです。3000円未満で買いました!

ちなみに、TF6340はシリアル通信用のライブラリです。

System Requirment

インストール

まず下記のLinkをアクセスしTF6340のインストールFileをダウンロードしてください。

https://www.beckhoff.com/en-en/products/automation/twincat/tfxxxx-twincat-3-functions/tf6xxx-tc3-connectivity/tf6340.html

言語は英語でよいです。

しばらく待ちます…

Next>をクリックします。

ライセンス同意し、Next>します。

UserNameなど入れて、Next>します。

Complete選ぶのは一番無難で、Next>します。

Next>します。

Installします。

しばらく待ちます…

これでインストール完了です。

構成

Manualによりますと考えられる構成が3つあります。

  • Option 1: PC COM ports
    • 直接COM PortとPLCに繋がり通信します。
  • Option 2: Beckhoff terminals
    • BeckhoffのField bus ターミナルと繋がり通信します。(最大100m)
      • KL6xxx Bus Terminals
      • EL60xx EtherCAT Terminals
  • Option 3:Virtual COM port
    • これは今回を使用する構成でVirtual COmを経由しPLCのOpeartion システムアクセスします。注意するのはWindows上では必ず”COM1,COM2″などを認識する必要があります。(TwinCAT/BSDなら”ttyu0,ttyu1..”など)

Support Hardware

まず最大の有効データ転送レート(bps)以下の要素に左右されます。

  • PLC Cycle Time
  • 転送のBit数(LB)
    • 1 Start bit
    • N Data bits
    • P parity bits
    • m Stop bits
    • 合計はStart bit+n Data bit+ P Parity bits +m stop bitになります。

私試してたのはSerial PC InterfaceとVirtual serial COM portだけなので、その2つを説明します。

Serial PC Interface

PCについてるシリアルPC Interface( COM1,COM2など)はTwinCAT システムに管理されます。ライブラリでは64BytesのBuffer使用しており、つまりPLCとインタフェースの間最大64Bytesのデータしか通信できません。その64Bytesのデータ交換は3つPLC Cycleが必要になります。計算公式はBps=(LB*64/3)/T。

私は自分のパソコンなので、構成まではできますが、通信はできませんね…

しかたですねー。

Virtual serial COM port

もちろんTwinCAT システムはVirtual serial COM Port(COM1..COM255 Windows)やTwinCAT/BSDなら(`ttyu0`…`ttyu255`)。その構成使うと、TwinCAT System Manager上でなにも構成する必要がありません。すべてのパラメタ(Stop bit,通信速度など)はFunction Blocksで設定します。ですが、そのConnectionはリアルタイムではありません。

baud rate は150 から128000 まで設定可能です。

通信の話

Support HardwareのTopicにも説明しましたが、最大のデータ転送のレードはPLC Cycle Timeに左右されます。例えば、いまアプリケーション上では通信Speedは9600bpsでPLC Cycle timeは1msだとしよう。大型なアプリケーションだとその構成はすごし厳しいかもしれません。

そこで大型のアプリケーションだとCycle timeはもちろんその分長くなりますね。例えばアプリケーション上で10msのCycle timeは充分だとしましょう。賢い方法としては実行周期を分けることです。つまりConnectionとデータExchangeですね。

  • Standard Task:10ms
    • アプリケーション上のプログラム実行CycleやデータExchange
  • Fast Task:2ms
    • Connection 制御

下図のようにPLCからSendByte・SendString・SendDataのFunction Blockを使用しDataをTxBufferに振ります。同じくReceiveByte・ReceiveString・ReceiveDataのFunction Blockを使用しデータを受信します。それはStandard Taskの仕事です。

次はSeriallLineControl というFunction Blockを使ってTxBufferからきたデータをVirtual Com ports経由で送信。同じく、Virtual Com portsからきたデータを受けとってRxbufferに書き込みます。

でも今回の例ではStandard TaskとFast Taskが分けてません。

Function Block

Exampleで使用したFunction Blockのみ説明しますので、ご了承ください。

SerialLineControlADS

このFunction Block周期こと呼び出しし、使用しVirtrual serial interfaceとPLC間の通信を管理します。考え方としてFast Taskに割り当ててください。

ConnectがTrueになりますと、SerialCfgで設定した通信設定使用し他のアプリケーションと通信始まります。SerialCfgが変更した場合、Connectを一回FalseにしまたTrueすればOKです。Portの開くなどはすべてFunction Blockが管理します。

VAR_INPUT
ConnectBoolTrue=Port開く、False=Port閉じまっす。
SerialCfgComSerialConfigシリアル通信設定
NetIdT_AmsNetIdLocalアクセスなら空文字もまましてください。
TimeoutTIMEDefault=5s
VAR_IN_OUT
TxBufferComBufferデータ送信のBuffer 変数SendByte,SendData, SendStringでこの変数使います。
RxBufferComBufferデータ受信のBuffer 変数ReceiveByte, ReceiveData,  ReceiveStringでこの変数使います。
VAR_OUTPUT
PortOpenedBOOLTrue=Port開きました
ErrorBOOLTrue=エラー発生
ErrorIDUDINTそのError内容示すのID
BusyBOOLTrue=ADS通信してる
TxBufCountUDINTまだTxBufferから送ってないBytes数
RxBufCountUDINTまだRxBufferに転送しなてないBytes数

ComSerialConfig

Port設定です。基本はComPort,Baudrate,Parity,DataBitsさえ設定すれば基本はOKです。

ComPortUDINTCom 番号1-255
BaudrateUDINT
ParityComParity_t
DataBitsINT
DTRComDTRCtrl_t
RTSComRTSCtrl_t
CSTBOOL
DSRBOOL
TraceLevelBYTENone=0;Error=1,Warning=2,Info=3,Verbose=4,Noise=5
Reserved1BYTE
Reserved2BYTE
Reserved3BYTE

ComBuffer

ComBufferは基本User programで書き込むものではなく、Fast TaskとStandard Taskの間の受け皿だと思ってください。VARエリアでこの変数定義し、SerialLineControlAdsに入れればよいだと思います。

BufferARRAY[0..300] OF BYTE
RdIdxINT
WrIdxINT
CountINT
FreeByteINT
ErrorINT
blockedBOOL

ReceiveString

このFunction Blockではシリアル通信からデータを文字列として受信します。

VAR_INPUT
PrefixSTRING空文字ではなかれば、データの頭文字は必ずこの変数と一致する必要です。
SuffixSTRING空文字ではなかれば、データの最後文字は必ずこの変数と一致する必要です。
TimeoutTIME
ResetBOOL
VAR_IN_OUT
ReceivedStringSTRINGDefault=5s
RxBufferComBufferデータ受信のBuffer 変数ReceiveByte, ReceiveData,  ReceiveStringでこの変数使います。
VAR_OUTPUT
StringReceivedBOOLTrue=文字列が受信した
BusyBOOLTrue=実行中
ErrorComError_tそのError内容示すのID
RxTimeoutBOOLTrue=Timeout

micro:bit

まずmicro:bitから本当にシリアル通信できるかどうかを確認しましょう。

下記のLINKをアクセスします。

https://makecode.microbit.org/

My Projects>New Projectをクリックします。

プログラムはWeb上でやりますのでIDEのインストールは不要です。

言語はBlocksやPython・Javascriptのような高級言語もOKです。

調べるのは面倒なのでBlocksを使用しますー

以下は通信テストのプログラムですね。

無限ループのなかにsMessageは3軸の加速センサーの現在値を取り込んで、最後はシリアル通信で送信します。

難しいことはやっていませんー

そして左にあるShow Console Simulatorでどんな出力になるかみてみましょう。

416 0, 0,-1023の数字が出てきますね。

416は現在は出力Count数で、0,0,-1023は3軸加速センサーの現在値です。

左側あるmicro:bitを押しながらMouseを動けばBoardを動いてる動作もSimできます。

ax,ay,azの値も変わってたとわかります。

テスト終わったら下にあるDownloadでプログラムをダウンロードしましょう。

このような.hexのFileがダウンロードしました。

micro:bitをUSBでパソコンと接続し、プロジェクトをそのままPasteしてください。

それでmicro:bit準備OKです。

テスト

シリアルテストするにはPuttyを使います。

下記のLinkからダウンロードしましょう。

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

Device Managerを起動します。

Ports>でMicro:Bitを一回さ直してどこのCOMを確認します。

自分のパソコンではCOM3ですね。

次はPuttyを起動します。

Connection Type:Serial

Serial line :COM3

Speed :115200

毎回設定するのも面倒なので、Saved SessionsのところにMicobit入れて、Saveします。

そうすると次再起動するとき、先保存したSessionを選びLoadすれば同じ設定になりますので。

設定終わったらOpenをクリックします。

Terminalが起動され、Micro:bitからデータずっと送ってるのは見えます。

そこまで来たら、まずMicro:bit側とパソコンが問題ないですね。

Example

こちらは今回の構成図になります。


Mirco:bit側

先の例とあまりかわりませんが、変数を作成しJoinのブロック使用一つの文字列まとめてからおくるだけです。

プログラム

References>Add libraryします。

TC2_SerialComを追加します。

VAR

VAR

RxBuffer :ComBuffer;
TxBuffer :ComBuffer;

SerialLineControlADS :SerialLineControlADS;
bConnect :BOOL;
stSerialCfg :ComSerialConfig;
sNetId :T_AmsNetId;
bAdsError :BOOL;
bReset :BOOL;
AdsErrorID :UDINT;

ReceiveString :ReceiveString;
data :STRING;
nReceiveCounter :UDINT;
END_VAR

PROGRAM

シリアルの設定はPuttyの設定に合わせてばよいだと思います。

//Config
stSerialCfg.Baudrate:=115200;
stSerialCfg.ComPort:=3;
stSerialCfg.DataBits:=8;
stSerialCfg.StopBits:=1;
stSerialCfg.Parity:=PARITY_NONE;

//Reset
IF bReset THEN
bAdsError:=FALSE;
nReceiveCounter:=0;
END_IF

//Open command line
SerialLineControlADS(
Connect:=bConnect
,SerialCfg:=stSerialCfg
,NetId:=sNetId
,Timeout:=
,TxBuffer:=TxBuffer
,RxBuffer:=RxBuffer
);

//Error
IF SerialLineControlADS.Error THEN
bAdsError:=TRUE;
AdsErrorID:=SerialLineControlADS.ErrorID;

END_IF

//Receive data
ReceiveString(
Prefix:=’x:’
,Suffix:=’$R$N’
,Timeout:=
,Reset:=
,ReceivedString:=data
,RXbuffer:=RxBuffer
);

//Total Counter
IF ReceiveString.StringReceived THEN
nReceiveCounter:=nReceiveCounter+1;
END_IF

結果

Micro:bitからデータもらったことがわかります。

サンブルCodeは以下でダウンロードできます。

https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT%20Project_TF6340_connectwithMicobit.zip

はーい、お疲れ様です。

もしなにか質問あれば、メール・コメント・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

シェアする

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

フォローする