TwinCAT3のTF6620 S7-Communicationを使用するとTwinCATシステムとSiemens S7 CPUと通信することができます。TF6620を使用すると、TwinCAT I/Oシステム構築方法や専用ライブラリでその通信方法を実装することができます。
注意するのは、その実装方法はTwinCAT TCP/UDP RT Driverベースで、読み書きできるのはS7 CPUの絶対アドレスのみです。
システム要求
Manual
インストール
まず下記のLINKをアクセスし、Software toolsをクリックします。
次はDownloadのところに最新バージョンをダウンロードします。
言語は英語にします。
Nextします。
ライセンス同意し、Nextします。
User Nameなどは適当にいれてっもOKです。
Completeを選ぶのは無難です。
Install始まります。
大体5分くらいかかるのかな。
Finish!
そして再起動すればOKです。
実装
話はここまで、これからは実装について説明します。そんなに難しくありません。
TwinCAT real-time Ethernet adapter追加
最初にも言いましたが、このTF6620はTwinCAT real-time Ethernet adapterベースで稼働していますので、もちろんそのDriverを追加は、必要です。
Solution>Project>I/O>Devices>Add New Item..します。
そこでEthernet>Real-Time Ethernet Adapter(..)を選び、OKします。
よし、これでTwinCAT real-time Ethernet adapter追加されました。
S7 Communication Driver追加
real-time Ethernet adapterが追加されたら、次はDevice>Device_1(それども設定された名前)右クリック>Add Object(s)します。
Beckhoff Automation GmbH>TcloEth Modules>TCP.UDP RT(Module)を選びます。
TCP.UDP RT(Module)が追加されました。
そのTCP.UDP RT(Module)に更に右クリック>Add New Itemします。
Beckhoff Automation GmbH>S7Comm>S7 Connector(Module)を選び、OKします。
S7 CPU通信設定
S7 Connectorも追加されました。そのObejct1をダブルクリックします。
通信相手のIP・CPU Type・Rack・Slotを設定できます。
今回はS71500と直接に通信しますので、
IPは192.168.0.1します。
CPU TypeはS71500します。
RackとSlotは0のままでOKです。
Mapping
通信先の設定が終わりましたので、次は交換したいデータを設定します。
Object1>Add New Item。
S7 Single Request とS7 Cycle Request
ここで選べるのはS7 Single Request とS7 Cycle Request2つです。
なにが違うでしょうか。みんなさんも思いつきかもしれませんが、それはリクエストのTrigger条件が違います。
S7 Single Request は”SendRequest”という変数が+1されるとき、S7CPUにリクエスト送ります。
S7 Cycle Request は周期でS7 CPUにリクエスト送ります。
いわゆる無条件かどうかですね。
Single Request
Single Requestのほうが少しテクニックがありますので、変数の設定方法はどっちも変わりません。なので最初はS7 Single Requestの実装、そのあとはS7 Cycle Requestの設定方法などを説明します。
まず先の画面でS7 Single Requestを選び、Okします。
そのObject追加したら、Status・Control・ReadFromS7・WriteToS74つがあります。
Statusはいまの通信状態でControlはS7CPUと通信制御するメモリが入っています。
ReadFromS7ははS7 CPUから読むのデータ。
WriteToS7はS7 CPUのメモリに書き込むのデータ。
そのObjsをダブルクリックしますと、右にRead VariablesとWrite Variablesの2つのTabあります。それは書き読みを設定するところです。
Read Variables
最初にS7CPUに読むデータを設定します。
+のボタンをクリックします。
そうすると、一列Idxが追加されました。
Siemens CPUの構造は次で説明しますので心配はありません。
Data Typeは32BitのDwordします。
S7 Data AreaはDATA_BLOCKSにします。
S7 Byte Addressは0します。
つまり0Byte目から32Bitデータなので、
0~3byteまでになります。
とりあえず3つの変数設定します。
ここで注意したいのはS7 Data Blockの数字です。
いま設定したのは、
1:DB1の0Byte-3Byte目のデータ、DWORD Type。
2:DB10の4Byte~7Byte目のデータ、Real Type。
3:DB11の0Byte目の7番目のデータ、Bool Type。
Nameはわかりやすく設定しましょう。
Write Variables
書き込むのほうも設定同じです。ここで詳しく説明しません。
先の追加手順終わると、ReadFromS7とWriteToS7のに展開できるようになります。
Siemens側
次はSiemens側の設定ですね。
新しいをプロジェクトを作成します。
Device Configuration をクリックします。
右のところにあるProperties Tabをクリックします。
General>Protection & Security >Permit access with PUT/GET…のCheckboxを入れます。
これはS7-1500/1200だけのセキュリティオプションです。
Checkboxを入れないと、CPUにS7-Communicationのリクエスト来ても返答はしません。
DB作成
次はRead/Write用のDBを作成します。
Program Blocks>Add new blockします。
Nameは好きな名前にしてください。
ここで適当にdb1にします。
次は読むの変数を追加します。最初はDWordですね。
追加したdb1を右クリックし>Properties。
General >Attributes>Optimized block accessのCheckboxを外します。それはDBを最適化しないという選択です。Siemensの新しいCPUではアドレスなしとありの二種類のDBが設定できます。
もう一度先のdbを見ますと、Offsetが追加されます。このOffsetはなにか覚えありませんか?それは先Read Variables・Write Variablesで設定したByte addressです。
Ctrl+Bでコンパイルしたら、0.0の数字が出てきました。つまりそのvar1はDB1.DBD0です。D=Doubleです。
次は同じな手順でdb10を追加します。
今度また新しいのDBに右クリック>Properties。
General>GeneralでNumberのところ、”Manual”を選び、Numberを10にします。
そうすると、先db10のとなりにある[DB2]が[DB10]に変わっています。
そのDB2,DB10はTwinCAT側で設定されたS7 Data Blockの数字です。
DB10が4番目のByteから始まりのRealなので、最初に4Byteの配列を定義し、アドレスをずらします。var2のアドレスはDB10.DBD4になります。
最後はdb11ですね。実はわざわざ右クリック>Propertiesしなくても、最初にDBを作成するときにNumberの下にManualを選択すれば、Numberのところが入力できるようになります。11を入れましょう。
中に長さ16のBool 配列を定義します。
最後はOffsetは7ですから、その”Offset”はいわゆるいまみんなさんが見えるのそのOffsetです。最後にアクセスするアドレスはDB11.DBX0.7になります。
Siemensのアドレスが0からCountしますので、注意してくださいね。
Write Variables側も同じな手順でやればOKです。
Address GAP問題
今回のテーマはSiemensではないので説明しなくてもよいと思いますが、みんなさんが、なぜ私いつも2Byteに揃えるように変数を定義すると、思いませんか?
それはSiemensのDBアドレスのコンセプトに関係があります。
例えば下図のようにdb20に後ろにBoolも1つ追加します。そしてさらに実数を追加。Offsetのところは8.0からいきなり10.0に飛んでしまいます。そうになると、マンなかにある8.1-9.7のメモリが無駄になってしまいます。もちろん、varBool2の下もう1つのBool変数追加すれば、Offsetは8.1になりますが、SiemensのDBで中の構造変更すると現在値はすべてStart valueに戻ります。(つまり初期化)それはできるだけ避けたいです。
テスト
事前準備
その前、自分がVirtualboxを使っていますので、Network Adapterの設定はこうになります:
そして実機がないので、SiemensのPLCSIM Advanced使えば、TCP/IP通信もシミュレーションできます。
OKなら、プロジェクトをダウンロードしましょう。
(もちろんPing コマンドなどで通信確認もしましょうね。)
もしTwinCAT側起動するときに1823のエラー出てきたら:
Connection状態
TwinCAT Runtime起動したら、最小はStateを見てみましょう。
Onlineでいまの値をMonitorします。0x40ならつまり接続OKです。
もしだめなら、Control>Resetで右クリック>Online Write ‘1’そしてまた’0’にしてConnectionをリセットしましょう。
Read
次はSiemensのエンジニアツールTIAからWatch tableを作ります。
次はControlのところにWriteToS7EnableをTrueにします。
Manualには、
Write commands are only executed if this variable was set to TRUE.
と書いています。つまりこの変数をTrueにしなとコマンドは実行しません。
ではOnlineでTrueを書きます。
次はControl>Requestの変数をみます。
いまは3が入っていますね。
新しい値を与えます。
4にしましょうか。
でも、なぜこういう与えを設定するかというと、Manualには:
この変数をプラスすることによって、Read/Writeコマンドがトリガーされます。それはなぜ3>4に変更する理由ですね。
By incrementing these variables from the application code, a read/write command (request) is triggered.
そしてS7 Controllerから返答きたらStatus.ReceiveCounter+1になります。
プログラミング側でこの変数を参照し、コマンドが成功するかどうかを判断できます。
As soon as the associated response has been received from the S7 Controller, the input variable, Status.ReceiveCounter is also incremented by 1
accordingly. The application thus knows that the read/write operation was successful.
次は、ReadFromS7のところにクリックします。
最初から設定した変数をMonitorできます。Siemens側設定した与えと同じですね!
Write
次は書き込みですね。
WriteToS7でこれから書き込むのデバイスの現在値など表示されています。
また、SendRequestを+にします。
よし、ちゃんと書き込みましたね!
本当はもっと書こうと思いますが、ちょっと疲れた。
第2話はSingle Requestのプログラミング・PLC HMIの画面も作ります。
第3話はCycling Requestの設定方法です。
第4話はPLC のライブラリ使って通信します。
はーい、お疲れ様です。
これは今回のプロジェクトです:
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT_Project_TF6620__1.zip