Siemens#SINA_SPEEDを使ってDriveを制御する

これはSiemensのDrive制御する紹介の第二回です。前回はSiemens社のStarterというソフトをどう扱うのか簡単に説明しました。Commissioning PanelでDriveを直接動かす方法も教えました。それはすごく大事です。
試運転するにはいきなりプログラム走らせてDrive動かすのは大体無理です。そのときも色々回りをみてものがぶつかってるかどうか？そもそも回れるか？もし回れないときはどんな問題なのかをクリアしないといけません。
そしてCommissioning Panelでもの回すことができ、今度はProgramで回ろうとしても全然動かないのあればそれはプログラムの問題です！とはっきりわかりますし。

[Siemens#StarterでDriveを試運転する](https://qiita.com/soup01/items/c5002a84ce4177d2d00e)

#SINA_SPEEDとTelegram１
ここでまず書きたいののは、そもそもTelegramってなんですか？ってことですね。
SiemensのTelegramはPLCとSINAMICSのドライブの間に通信するだめに使われてるもので異なるアプリケーションで違うTelegramを使うです。普通には：

- Profidriveの標準Telegram(Telegram1)
- Siemens Telegram(Telegram111) 
- ProfiSafeを使うときのTelegram(Telegram30)
- Free telegram(Userがカスタマイズする)

もしSinamicsでBasic Positionを使うにはTelegram111を使う必要。
もしSinamicsで簡単な速度制御だけならTelegram1だけでもいい。
Siemens社がそれを簡単に制御できるのLibraryを提供しています。

- 速度制御ならSINA_SPEED。
- 位置決めならSINA_POS。
- パラメータ読み取りならSINA_PARA。

って感じですね。もちろんすべてのTelegramの詳細をManualみてくださいね。

#ライブラリインストール
自分使ってるTIAバージョンに合わせてDownloadしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/32ee625b-cadf-a35a-54cf-7898b2704aa1.png)

Zipを解凍したらDriveLib.msiがあり、タプルクリックしセットアップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2c868c27-0452-4341-e0db-9fa2f2cf4eac.png)

Library>Drive_Lib_S7_1200_1500>Master copies>03_SINAMICS>SINA_SPEEDをProgram blocksへ引っ貼ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1e4d591a-66de-2101-e50d-7374579144fc.png)

#Hardware設定
次はHardware構成を追加します。G120を使い、Telegram1を使用します。
##TIA
G120を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/186661a1-c6db-7386-21a4-04f3dde74bed.png)
Not assignedのところクリックしPLC_1.PROFINET interface_1をクリックします。
そうすることによってPLCとG120がProfinetで繋がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/7696d587-574f-208b-2849-5e854ec7b18c.png)
Profinetでデバイスを繋がりするにはデバイス名・IP両方も必要です。ここでまず1の目アイコンを押してIP表示し、2と３でIPとデバイス名を図面合わせて設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/cdb76a6e-ee09-937f-d2cf-489d61412ba8.png)
G120をタブルクリックしSubmodules>Standard telegram 1,PZD 2/2を引っ貼ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/0399de25-3c41-b665-b1bd-97908d43753d.png)

##Starter
Fieldbusをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/131a05eb-6596-61a3-4298-97d8ddb52eae.png)

右のこのような画面が出てきます。

1.PLCとDriveの通信Protocol、Ethernet・Profinetを選びます。
2.いま表示されてるのはDriveが送るデータか、Driveがもらうデータかの選択。すべてDrive側からを基準にします。
3.Safey Profisafeを使うならここでTelegram30を選びます。
4.DriveとPLCの間に通信するのはProfinetで選択しましたが、ではどんなTelegramをするか？をここ設定できます。今回は回すだけなのでTelegram1にします。
5.設定したTelegramに該当する交換のデータ一覧。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f23f25fa-c6a3-ea66-16d7-75bf154c5bfa.png)

###Telegram１説明
それでもう少し話しましょう。これはTelegram1がPLCとDrive実際交換してるデータ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/5ddd5c9c-874c-3e64-4614-f9e9a444f8d3.png)

STW1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/23888a5d-052e-072f-78dd-b9f72a0201f1.png)
ZSW1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/0d79d518-ee85-0d63-c3bd-0638d0b9016f.png)
そしてSTW1のところをクリックしますと、右側に小さいなPopupが出てきます。
そこで同じくSTW1の16Bitデータがどんな意味を持っているかわかります。Onlineにすると該当する信号がOnしてるかどうかもわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c3dfeb6e-e81f-99d4-0f6b-5070ab5d6c4f.png)
次はNSOLL_Aを見てみましょう。
いまはNSOLL_A(PLCからもらったWordデータ)がp1070[0]とつながっています。
では青い四角を押してFurther interconnectionsを押してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/36429a8a-4590-b6c2-e2db-765ec0f4f4f6.png)
右側はこのような画面出てきます。P1070[0]の隣に小さいなCheckbox入れてますね。そしてP1070[0]はSpeed Setpointです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/dff71836-9c99-3458-8d6c-babcb2a9374c.png)
P1070の説明：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/237effe5-1364-dfe1-f366-94ac5ae2960a.png)

同じの考え方で、今回はDriveをPLCに送るもの見てみましょう。
1.Transmit directionを選択します。
2.ZSW1をクリックします。
Popupが出てきて、DriveからPLCへ送る16Bitデータがどんなデータが見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1d1278a9-35ee-6a2c-37bb-4a84bf90b294.png)

みんなさん少し疑問がありませんか？少なくても私はじゃこのReadyは実際どこから取ってるの？って聞きたくなりますよね。先のPopupのところMouse iconを持っていくと、r2053[0]が見えますね！それはメモリ2053番って意味です。
r=読み込みだけ
p=書き込み可能、つまりパラメータ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/776cb2b3-b0f9-e3df-74dd-867fc4fe9608.png)
つまり、r2089[0]からデータを取ってそのままr2053[0]へ転送するって意味ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/0a3cee77-3687-d00a-1fa8-31fbe9fcc94d.png)
この2089がなにか知りたいなら、Expert listをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/789ac863-b9c6-05ed-806d-dd3fbc346922.png)
Parametersの下あるAllのところに2089入れてEnter押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/5739eedf-39f8-926a-3dc2-b869bf8bc831.png)
話戻りますと、r63[0]がDriveの現在Speedでこの現在SpeedはNIST_Aに繋がります。
Word format、PZD2です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/28dc64af-ba0a-620a-f00e-27dbd96d985e.png)
そうすると2089は実際なんなのか見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/230de76d-a9ec-82e9-2d91-acf84c84ebb9.png)
もう一つのみかた：Diagnostics>Interconnections
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/a04eac8e-3ca6-ee73-f72f-837f1ccd8b0d.png)

ここでもStatusなど見えますよ～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/7de33664-d4db-a035-659d-1425ea811f35.png)

##プログラム
いままたTIAに戻ります。SINA_SPEEDを詳しく見ましょう。これはSINA_SPEEDの構造です。SINA_SPEEDの中にDPWR_DAT(Profinetデバイスへ書き込むの命令)とDPRD_DAT(Profinetデバイスへ読み込みの命令)があり、Function BlockなのでMemoryがインスタメモリも必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/30a2ed17-8f61-4ba5-06f5-1bd2e87ec20b.png)

###SINA_SPEED
こちらはSINA_SPEEDのFunction Blockです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/464a30de-7de7-87f7-1cbd-97341ba0af9d.png)

####Input

- EnableAxis（Bool)
    - Driveを開始・停止する。(Drive Control Word1のBit0に割り付けます)
- AckError（Bool)
    - Driveのエラーをリセットする(Drive Control Word1のBit7に割り付けます)
- SpeedSp(Real)
    - Speed設定(1/min)
- RefSpeed(Real)
    - MotorのMax Speed(この設定はp2000と一致する必要あります)
- ConfigAxis(Word):Driveの他のControl Wordを設定するもの。(p2090)
    - Bit1:OFF2
    - Bit2:OFF3
    - Bit3:Enable Operation
    - Bit4:Enable Ramp-Function Generator
    - Bit5:Continue Ramp up Function Generator
    - Bit6:Enable Speed Setpoint
- HWIDSTW：通信するDriveのハードウェアID
- HWIDZTW：通信するDriveのハードウェアID

####Output
- AxisEnabled（Bool)
    - Driveが有効してるかどうか
- Lockout（Bool)
    - Driveが障害されてる
- ActVelocity（Real)
    - 現在Speed
- Error（Bool)
    - Driveがエラーあります
- Status（Word)
    - Drive状態
        - 16#7002：正常
        - 16#8401：Driveはエラーあり
        - 16#8402：Driveが障害されてる
        - 16#8600：DPRD＿DAR命令がエラーある
        - 16#8601：DPWR_DAT命令がエラーある
- Diagld：（Word)通信エラーときの診断

###実装
では簡単なプログラムを作ってみましょう。一つのFunction Blockを追加します。名前はG120とつけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c7be5adb-25cd-6654-8b8a-f438b8baad8e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/54788ea7-b418-d29e-24f4-3851d27eb03c.png)


####Interface
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/d1186226-d5fd-3182-634c-5400fdc6c4bc.png)

#####NTW1:Driveのリセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2a088fb6-3482-d9bc-391c-1f86abef604b.png)

#####NTW2:DriveのEnable、もしエラーが発生した場合、リセットしない限りONできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/b146ce61-c074-0b60-19bc-6e86305f6187.png)

#####NTW3：RefSpeedだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4bd31220-a375-d3c7-2c3f-2c6761be3e09.png)

#####NTW4：もしRunコマンドが入ったらSpeed設定値をsina_speedに書き込みます。
そうじゃない場合は常に０入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4add533e-5762-6848-daf6-0dc05121676a.png)

#####NTW5：HWIDをSINA_SPEEDへ転送します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/8b44cfdc-3373-73ca-d45a-8ee61f9715dd.png)

#####NTW6：SINA_SPEEDを呼びだす。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c8ff2f77-bf74-6659-be93-81a297745956.png)

#####NTW7：DriveもうEnableしてる状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4bb364de-a052-a11a-d593-4ee306066c6b.png)

#####NTW8：Driveはなにか障害されてる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/5e3dc390-c466-fb4c-6ed4-8cfd2c856523.png)

#####NTW9：現在Speed。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/36fa85ea-1408-1280-897c-1337f7f5abe6.png)

#####NTW10：Errorが出てますよ～のFlag。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2a94bc4c-ff24-9270-ae15-ef2f494ea031.png)

#####NTW11：Statusによってエラーの種類を明確する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ccba7e8c-501f-1696-9709-1b93d561fe64.png)

#####NTW12:通信エラーなどのときのStatusを取ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/db6b4062-4694-c6cb-9fd9-757b4e943278.png)

#####NTW13：Error出たらリセットしない限りずっとONしままします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4e9e2172-27d6-658a-8c0a-6712e1273969.png)

####HWIOの確認方法
Device viewを選んで、G120のクリックし、“System constants”を選んで、“XXXXX_Standard_Telegram_1XXX”です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/597f800e-62ed-01e6-52bf-c042620c543a.png)

##おまけ１-SINA_SPEEDの中身
SINA_SPEEDの中身はSCL言語で作成されており、私的には4つに部分に分けます。

- Part1はLine20-36 、InputのConfigAxis、EnableAxis、AckErrorをSTWに割り付けるプログラムです。
- Part2はLine38-55、Speed設定を割付る部分です。
- Part3はProfinetデバイスにデータ送信する命令を使うプログラム。
- Part4はもし送信がエラーないならそのとき処理とProfinetデバイスからデータもらうの命令と、そのデータの処理のプログラムです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/441db973-4bb6-8d2b-c55f-a5feb04402ea.png)

###Part1
まずEnableAxis,AckErrorがSTW1.%X0とSTW1.%X7に入ります。STW1.%X10はPLCでコントロールするかどうかを設定するです。SINA_SPEED使うことになると、もちろんPLCがコントロールするのは当たり前まえなので、ここで定数“TRUE”を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c2310197-a06f-a9e8-07e0-9f0297c3b33b.png)

次は％X0,%X1とかはなんですか？これはSiemensのPLCがWord,Int,Byteなどの変数のBit0、Bit1だけをアクセスするときに使うの機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ef626974-1564-a656-c484-4ca1b432dbcb.png)
例えば16#7をWordVariableという変数へ与えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/91733a19-6125-fdc9-4573-22a67834f1c9.png)
そうすると、みんなさんもご存知だと思いますが、Bit0,1,2がONになります。
つまり％X0,%X1,%X2もONになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2dd75fea-8e5d-8ad3-2ca4-56e1f23eb1fb.png)
今度逆に％X0,%X1,%X2をONすると、WordVariableの値が16#7になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/39c59623-9f1e-7e73-6655-9e16a05679e9.png)
話戻りましょう。Configの変数がDefault値は16#3Fです。つまり：
％X0~％X5がONになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/5f7d18a6-907f-6511-c786-af5ff4c251b2.png)

16#3F実際の意味はそれらのOperationを常に使うというこです。
詳細は先のSTWをみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e4c90cb8-a735-3896-e026-0ac299bdd6a9.png)

###Part2はLine38-55、Speed設定を割付る部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/bbdc2c3b-983f-770b-a694-2be698ed8de4.png)

Line39：RefSpeedは0じゃないかをCheckする。どこのプログラム言語も同じですが、値を0に割ってしまうとエラーになりますからね。
Line40：まず頭から？に出てくるのは16384ですね。これはなんの数字？だと思いますね。
まずもう一度StarterからDriveがもらうSpeed設定はどこのパラメータいくのか？p1070ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/a8867600-fdd7-992a-4584-0bfb2ddd94a6.png)
次はp1070をHelpで見てみましょう。
Maxは4000って書いています。4000Hex＝16384Decです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/200a8240-e629-811e-0497-bc2c8d6e5cb5.png)
つまりLine40やってるのは比例計算です。例えば、RefSpeedは2500、いまSpeed設定は1300だとすると、
SpeedSp*(16384.0/RefSpeed)=1300x(16384/2500)=8519。

Line42－48はSpeed設定は16BitのIntの最大値と最小値に超えたかどうかをCheckします。
Line49はデータ型式をWordに変換し、Bufferへ移動します。
Line51-52はもし最小のRefSpeedが0だったらSpeed設定値も0に書き込みます。
Line54-55はSTW1とSpeed設定をデータ送信Bufferへ移動します。

###Part3はProfinetデバイスにデータ送信する命令を使うプログラム。
ここで命令の説明を割愛します。
命令の実行結果をpiRetSFCへ転送、WordからINTに変換しDiagIdに格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/31a9717f-6165-2089-73c6-906aa77910c5.png)

###Part4はデータもらうのプログラムです。
かなり長いのでさらに分けて説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/0731593f-9f67-46e5-a382-8f8539735bcc.png)


####Part1
先データ送信の命令を使ってたとき実行結果piRetSFC を0かどうかを比較します。
もし0じゃないならなにかの通信エラーなので処理しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/b34109d3-1fb8-4a60-e6e2-4fdd8a949ad6.png)

####Part2
もしpiRetSFCが0のであれば通信問題なしのことで、DPRD_DATの命令を使ってDriveからデータをもらいます。
そしてまた命令の実行結果をpiRetSFCへ転送、WordからINTに変換しDiagIdに格納します。(なぜpiRetSFC二回も比較するのはよくわかりませんが…)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/07b49a02-43ae-c438-0d00-8b10371e97f6.png)

####Part3
またかなり長いので分けて説明しますね。
まぁ、まずもし命令実行がエラー出たら、Block出力すべて0にします。
現在SpeedとかDriveEnableとか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c286a7a0-1de0-a99c-8d85-de337e9ff129.png)

次に、Line71使ったDPRD_DAT命令でDriveからもらったデータがsxRecvBuffに格納します。ZSW1は0番目のWord、Velocityは1番目のWord。
そのあとは単なるZSW1とかに合わせて値を与えるだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6648443e-cfae-c694-8c86-5a3f4127ea66.png)

Line155－161はRefSpeedじゃないとき（０で割るとエラーがでますかね）。そしてまた同じ計算式で現在Speedを計算し出力します。
もしRefSpeedは０なら現在Speedも０にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/56d0ff47-dc60-3acf-6999-a19d3385d765.png)

Line162-168はもし通信エラーがあったらErrorをTrueにし、Statusを出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e10577f7-d9d6-1add-bdb3-565a4a84aafe.png)

##おまけーBrake付きの設定
DriveUnit>Control_Unit>Functions>Brake control
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/288f5387-04b7-6285-2589-539706f7b8af.png)
Motor holding brakeを1にします。“Motor holding brake acc. To sequence control”です。
これを選択しますと、実際p1215=1になります。
ではp1215をみてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/9320d83b-8826-109a-4ff1-1ca05b511e56.png)

これはTime-chartです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e2e6a4b2-1081-838d-3981-ea59a0ce88a6.png)

そしてDC brakeを5にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/2c4732f5-bf6f-4dc2-b29b-7585119c5e44.png)

#参考Link
[SINAMICS G: Controlling a speed axis with the “SINA_SPEED” block](https://support.industry.siemens.com/cs/document/109485727/sinamics-g%3A-controlling-a-speed-axis-with-the-%E2%80%9Csina_speed%E2%80%9D-block?dti=0&lc=en-WW)
[SINAMICS communication blocks DriveLib for activation inTIA Portal](https://support.industry.siemens.com/cs/document/109475044/sinamics-communication-blocks-drivelib-for-activation-intia-portal?dti=0&lc=en-WW)

はーい、お疲れ様ですー