日記；回すだけ⑥TwinCATでST言語をちょっとだけ触る

　この記事を書き始めたとき、ST言語をキーワードに入れたら、なんと驚くなかれ、1件しか出てきませんでした。EtherCATでは6種類の言語が規定されたIEC 61131-3 (IL, FB, LD, AS, **ST**)がプログラミングに使えます。PLCで一般的なラダー言語も含まれています。

　Pascalが語源といわれていますが、きっと70歳前後の人しか使ったことがありません。ST言語はC言語によく似ているかもしれません。

###ディジタル出力を事例にST言語を使う
　ここで、モータは動かしません。現時点で、まだ動かすプログラムが書けていません。なので、ベッコフのカプラにつながっているディジタル出力をST言語で制御します。
###PLCにプログラムを入れる
　左のソリューションエクスプローラのPLCにマウスを置いて、右クリックで新しい項目の追加をクリックします。Standard PLC Projectを選び、追加をクリックします。
![t1001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/eb1a4bf8-0428-cb0b-dedc-e7856440167d.png)

　Untitled 1ーUntitled1プロジェクトーPOUsーMAIN（PRG）を開くと、中央にソースの入力できるエディタ・エリアが開きます。
　上の部分はローカル変数の宣言で、下がプログラムの記述エリアです。
　``heatbeat := heatbeat + 1;``
を記入してリターンをたたくと、自動宣言というパネルが出ます。初期値に0を入れ、OKを押します。
![t1002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/d39810dd-aad7-8076-cdfa-1f13a4385dbb.png)
　ローカル変数が追加されました。INTは16ビットです。32ビットはDINTです。
![t1003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/75328f4d-0e9b-5a2c-8d4c-662b3a68e7ee.png)
　プログラムMAINは2msに1回実行されます。したがって、変数heatbeatは、0から2msごとにインクリメントされます。
　つぎに、ch1_outというBOOL変数にheatbeatを8で割ったときにTUREを代入する式を追加します。自動宣言は、デフォルトのままOKを押します。

![t1004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/ea7675b6-a28e-9dc1-6acb-5888429edc69.png)

　ローカル変数に追加されました。
![t1005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/740e1811-e231-a65d-7318-ec250e334e34.png)
　このch1_out変数部分を修正します。追加した、
  ``AT %Q*``
は、物理的などこかの出力ポートのリンク変数だということを表します。入力デバイスなら ``%I*`` です。
![t1006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/e395f557-87ff-eb19-ee36-296889ff272a.png)
　実際のポートは、I/OにいるEL2008出力モジュールのChannel1ーOutputを右クリックしてリンクの変更を選択します。

<img width="550" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/293b51b7-2af3-74d8-958b-ecfaa9d179c9.png">


　このパネルに何も出てこないことがあります。その場合、構成の有効化をクリックします。ch1_out変数はどこどこにリンクというのを選択し、OKをクリックします。
![t1008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/6fce7787-0ff5-7929-206a-b6f2ae4d2ab2.png)
　ビルドします。

<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/79440913-b761-afaf-deeb-28bf6e921077.png">

　構成の有効化をクリックします。同じ列の緑の矢印をクリックします。実行開始です。
![t1010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/a1c42698-ca01-2857-89d6-f42a0826135c.png)
　ターミナル（EL2008）のOutputをダブルクリックし、上部のバーのTwinCAT Project9の文字部分にマウスを置き、マウスの右ボタンで出てくるメニューの水平タブグループの新規作成を選びます。すると、MAINソースと、Outputの情報の画面が同時に見れるので、オンラインのタブを選びます。
　緑の右三角をクリックすると、プログラムが動きます。
![t1011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/06353f93-9697-9255-e408-6fc95ce72c06.png)
　2msに1回、このMAINは動くのですが、画面の更新は追いつきません。``heatbeat  MOD 64``と頻度は下げたのですが、めったにch1_outはTRUEになりません。したがって、グラフもときどきしか'1'にならないですが、EL2008の動作確認用LEDはずっとピカピカ点滅しています。
　止めたいときは、緑の三角の右横にある赤い四角を押します。その右にある赤色の矢印をクリックすると、ソース修正・追加画面に戻ります。
![t1012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/9f8e51f4-2763-e4e9-837b-1f9560723fa3.png)

　実行中のようすです。
![IMGP0628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/487736d5-6cf7-0673-d9a9-1db52af9fc0c.png)


###資料
　上記のサンプルは、[Motion Control and IO with PLCs - EP4 - Beckhoff TwinCAT IO](https://www.youtube.com/watch?v=eHfJ3C5lhKA&t=656s)が詳しいです。

　Hello Worldだけを出したい事例は、[PLC programming using TwinCAT 3 - Tasks, programs & “Hello world” (Part 3/18)](https://www.youtube.com/watch?v=P9uUgT8EhUM)の44:35付近にあります。IF文の事例でもあります。2msごとにやってくるMAINで、一度だけメッセージを表示するときプログラムです。
　
[PLC programming using TwinCAT 3 - Data types & arrays (Part 4/18)](https://www.youtube.com/watch?v=JSFvSu8uB9U)の、

- 4分からは、型
- 15分からは、enum
- 23分からは、pointer
- 26分からは、references
- 32分からは、arrays
- 36分からは、型変換

[PLC programming using TwinCAT 3 - Structures & functions (Part 5/18)](https://www.youtube.com/watch?v=zB_2x0NPMGc)の、

- 最初は構造体
- 4分からは、関数


　ベッコフのドキュメント、サンプルは、https://infosys.beckhoff.com/にありますが、膨大です。

###つづき
　以上で、回すだけは終了です。
　EPOS4のプログラミングは、次の資料があります。また、maxonのサイトから、いろいろな言語のサンプルをダウンロードできます。

[EPOS4 Application Notes](https://maxonjapan.com/wp-content/uploads/manual/epos4/EPOS4-Application-Notes-Collection-En.pdf)

ベッコフの[PTP – point to point movement](https://infosys.beckhoff.com/english.php?content=..%2Fcontent%2F1033%2Fhtml%2Fbkinfosys_intro.htm&id)は、MOTIONのサンプルのようです。
　何かしら動いたら、続きを書きます。