今回はBeckhoff TwinCAT3 TF6340とmicro:bitをシリアル通信してみます。意外と楽しかったです。なぜmicro:bitを使うと言いますと、簡単でDrop&Dragプログラミングできますし3軸の加速センサー・スイッチ・温度センサーついて、シリアル通信経由でそれらの通信を検証できます。そしてやすいです。3000円未満で買いました!
ちなみに、TF6340はシリアル通信用のライブラリです。
System Requirment
インストール
まず下記のLinkをアクセスしTF6340のインストールFileをダウンロードしてください。
言語は英語でよいです。
しばらく待ちます…
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
- BeckhoffのField bus ターミナルと繋がり通信します。(最大100m)
- 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 | ||
Connect | Bool | True=Port開く、False=Port閉じまっす。 |
SerialCfg | ComSerialConfig | シリアル通信設定 |
NetId | T_AmsNetId | Localアクセスなら空文字もまましてください。 |
Timeout | TIME | Default=5s |
VAR_IN_OUT | ||
TxBuffer | ComBuffer | データ送信のBuffer 変数SendByte,SendData, SendStringでこの変数使います。 |
RxBuffer | ComBuffer | データ受信のBuffer 変数ReceiveByte, ReceiveData, ReceiveStringでこの変数使います。 |
VAR_OUTPUT | ||
PortOpened | BOOL | True=Port開きました |
Error | BOOL | True=エラー発生 |
ErrorID | UDINT | そのError内容示すのID |
Busy | BOOL | True=ADS通信してる |
TxBufCount | UDINT | まだTxBufferから送ってないBytes数 |
RxBufCount | UDINT | まだRxBufferに転送しなてないBytes数 |
ComSerialConfig
Port設定です。基本はComPort,Baudrate,Parity,DataBitsさえ設定すれば基本はOKです。
ComPort | UDINT | Com 番号1-255 |
Baudrate | UDINT | |
Parity | ComParity_t | |
DataBits | INT | |
DTR | ComDTRCtrl_t | |
RTS | ComRTSCtrl_t | |
CST | BOOL | |
DSR | BOOL | |
TraceLevel | BYTE | None=0;Error=1,Warning=2,Info=3,Verbose=4,Noise=5 |
Reserved1 | BYTE | |
Reserved2 | BYTE | |
Reserved3 | BYTE |
ComBuffer
ComBufferは基本User programで書き込むものではなく、Fast TaskとStandard Taskの間の受け皿だと思ってください。VARエリアでこの変数定義し、SerialLineControlAdsに入れればよいだと思います。
Buffer | ARRAY[0..300] OF BYTE | |
RdIdx | INT | |
WrIdx | INT | |
Count | INT | |
FreeByte | INT | |
Error | INT | |
blocked | BOOL |
ReceiveString
このFunction Blockではシリアル通信からデータを文字列として受信します。
VAR_INPUT | ||
Prefix | STRING | 空文字ではなかれば、データの頭文字は必ずこの変数と一致する必要です。 |
Suffix | STRING | 空文字ではなかれば、データの最後文字は必ずこの変数と一致する必要です。 |
Timeout | TIME | |
Reset | BOOL | |
VAR_IN_OUT | ||
ReceivedString | STRING | Default=5s |
RxBuffer | ComBuffer | データ受信のBuffer 変数ReceiveByte, ReceiveData, ReceiveStringでこの変数使います。 |
VAR_OUTPUT | ||
StringReceived | BOOL | True=文字列が受信した |
Busy | BOOL | True=実行中 |
Error | ComError_t | そのError内容示すのID |
RxTimeout | BOOL | True=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 (*を@に)