Beckhoff TwinCAT3からSiemens Sinamacs S210を動かす第4話になります。前回はPLCOPENライブラリでDriveを動かしましが、S7-1200とBeckhoff IPCと直接通信がなく、STOリセット信号やS7-1200の状態をもらうことができなく、S7-1200からリセット信号かけるしかできませんでした。
ProfinetではI-Devicesという機能があり、S7-1200がControllerでありながら他のControllerのDevicesとして働くことが可能です。今回の記事はその機能を紹介し、必要な設定・あとS7-1200の診断やS210の診断情報を取得するプログラムを作成し、Beckhoff IPCに渡します。よろしくおねがいします。
Thanks!
この記事が出来上がるのはベッコフ日本法人ベッコフオートメーション株式会社さまとMana Design worksさまから機材を貸してくださったおかけです。誠にありがとうございます。
ベッコフ日本法人ベッコフオートメーション株式会社
IPC6920-005はベッコフ日本法人ベッコフオートメーション株式会社さまが貸してくださったものです。Beckhoff Automationは1980 年会社設立、PCベースの制御技術をベースにしたオープンオートメーションシステム導入の先頭に立つドイツ企業です。
ベッコフ日本法人ベッコフオートメーション株式会社は、2011年に横浜に本社、2017年に名古屋オフィスを設立しました。
こちらはベッコフ日本法人ベッコフオートメーション株式会社様のホームページです。
どうぞよろしくお願いします。
https://www.beckhoff.com/ja-jp/
Mana Design Works
Siemens SINAMICS S210はMana Design Worksさまが貸してくださったものです。
Mana Design Worksは大阪に本社あるSiemensの正式なソリューション パートナーで、Siemens製のCPU・HMI・Drive・Motion Controller・SCADAから国産メーカまで常に最適な提案ができます。
こちらはMana Design Works 様のホームページです。
どうぞよろしくお願いします。
Video
English Version
Part4
Beckhoff.TwinCAT3 x Siemens S210 Servo Drive part4 – Idevices Configuration.EN
Part3
Beckhoff.TwinCAT3 x Siemens S210 Servo Drive part3 – PLCOPEN to Control the Drive in TwinCAT.EN
Part2
Beckhoff.TwinCAT3 x Siemens S210 Servo Drive part2 – Shared Devices,Profisafe.EN
Part1
Beckhoff.TwinCAT3 x Siemens S210 Servo Drive part1.EN
Japanese Version
Part4
Beckhoff.TwinCAT3 x Siemens S210 Servo Drive part4 – Idevices Configuration.JP
Part3
Beckhoff.TwinCAT3 x Siemens S210 Servo Drive part3 – PLCOPEN to Control the Drive in TwinCAT.JP
Part2
Beckhoff.TwinCAT3 x Siemens S210 Servo Drive part2 – Shared Devices,Profisafe.JP
Part1
Beckhoff.TwinCAT3 x Siemens S210 Servo Drive part1.JP
Reference Link
Japanese Version
Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part2 |
English Version
Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part2 |
Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part1 |
Implementation
Siemens Side
まずはSiemens側を実装します。
I-Devices
S71200>PROFINET Interface[x1]>Operating ModeからIO deviceのCheckboxを入れます。
i-device communicationの下にあるTransfer areaが表示されます。
<Add new>ボタンでデータ交換エリアを追加します。
Transfer area_1はI300.0からI319.7まで20Bytesです。
IP
次はs7-1200のipアドレスを設定します。PROFINET interface[X1]>Ethernet addressesを開き、IPとPROFINET関連設定できます。
IP address is set directly at the devicesとPROFINET device name is set directly at the deviceのCheckboxを入れてください。
Export GSDML
次はTransfer areaの下に”Export”ボタンからGSDMLをExportします。
Export先を設定し”Export” ButtonでOKです。
Add OB
CPUがエラーのことでSTOPにならないよう、OB82、OB83、OB86を追加します。
OB82? Diagnostic error interrupt OB
診断機能がついてるモジュールが診断状態が変更すると、CPUに通知します。その通知は” diagnostic interrupt リクエスト”です。
Event がきたとき、OB82のLocal tagは診断データを格納されるようになります。
もしCPU内でOB82がないなら、CPUがStop Modeに切り替わります。
OB82を制御する関数があります。
DIS_IRT関数でそのOB82を無効にします。
EN_IRT関数でそのOB82を有効にします。
DIS_AIRT関数はDIS_IRTのDelayです。
EN_AIRT関数ははEN_IRTのDelayです。
OB83?
OB83は以下の原因で呼ばれます。
構成されたモジュールが挿入・取り出すされた
モジュールのパラメータが変更し、CPUがRunの状態でStep7からDownloadされたとき
もしCPU内でOB83がないなら、CPUがStop Modeに切り替わります。
そのOB83はSFC39から42で制御できます。
OB86?
OB86はRack Failure Organization Blockで、以下の原因で呼ばれます。
DP Master Systemがエラー検知されたとき
分散IOがエラー検知されたとき
もしCPU内でOB86がないなら、CPUがStop Modeに切り替わります。
OB86を制御する関数があります。
SFC 12 “D_ACT_DP” setting MODE=4、Stationを無効する
SFC 12 “D_ACT_DP” setting MODE=3、Stationを有効する
Startup Condition
次はCPUがHardware Configuration一致しなくてもRUNになるようにGeneral>Startup>Startup CPU even if missmatchを選択します。
LLDP V2.2?V2.3
LLDPは “Link Layer Discovery Protocol”で、IEEE-802.1ABの標準Protocolです。
EtheCAT Devicesは周期でLLDP Protocolで接続してるデバイスに自分の情報を送信します。次はSNMP(Simple Network Management Protocol)はそのLLDP情報を読み込み・Network Topologyを作成する。
基本的にFieldbus standard IEC61158 V2.2はProfinet デバイス内に実装されています。
でも、一部のProfinetデバイスは新しいLLDP Protocol実装されたものもあり(V2.3)、
Siemensや他社のものはそのV2.3でProfinet Devicesを検知します。
ここで注意するのはProfinet ネットワーク内ではそのLLDPのバージョンを統一する必要があります。
もしTIAですべてのProfinet 機器を構築する場合、Step7が自動でLLDPのModeを修正し、それらの設定を心配する必要がありません。
Use IEC V2.2 LLDP modeのCheckboxはDefault Checkされていません。
Use IEC V2.2 LLDP modeが選択され、なおかつ変更できないのであれば、PROFINETネットワークはLLDP V2.2だけSupportになります。
Use IEC V2.2 LLDP modeのCheckboxが無効されたが変更できるのであれば、PROFINETネットワークはLLDP V2.2でもV2.3でもOKです。
その設定には簡単なルールがあります。
もしすべてのDevicesがIEC V2.3 Supoortであれば、Step7は自動でSubnet ModeをIEC V2.3に切り替えます。
もしひとつだけのDevicesがIEC V2.2だけのSupportであれば、Step7はSubnet Modeを強制的にV2.2に切り替えます。
Function Blocks
LED
こちらのFunction ”LED”を使用すればモジュールのLED状態を取得可能です。(例えばON/OFF/Flashing
LADDR パラメタではCPUやモジュールのInterface変数を入れてください。
RET_VALはFunctionのReturn値で関数の実行結果を返します。たまに対応してないLEDの場合もございますので、状態を取得したモジュールのManualを参考にしてください。
VAR_INPUT
Variable Name | Type | Description |
LADDR | HW_IO | Hardware Interfaceの識別子、たとえばCPUの場合はCPU名+∼Commonになります。 |
LED | UINT | LEDの識別子、1=STOP/RUN、2=Error、3=MAINT、5=Link、6=Rx/Tx |
Return Value
Variable Name | Type | Description |
RET_VAL | INT | LEDの状態(詳しくTIAのHelpに参考してください) |
GET_DIAG
こちらのGET_DIAG関数を使用すればハードウェア部品の診断情報を取得できます。MODEパラメタから取得したい診断情報も選択できます。ちなみに今回記事で使用するS7-1200ではMODE=0になるとLADDRのパラメータが無効になります。
今回の記事ではMode=1を使用します。Mode=1をすることによって関数の出力診断情報はDIS構造体に変わります。
VAR_INPUT
Variable Name | Type | Description |
Mode | UINT | 取得したい診断情報を選択する |
LADDR | HW_ANY | ハードウェア部品の識別子 |
VAR_OUTPUT
Variable Name | Type | Description |
CNT_DIAG | UINT | Always=0 |
LADDR | HW_ANY | ハードウェア部品の識別子 |
VAR_IN_OUT
Variable Name | Type | Description |
DIAG | VARIANT | 診断情報、詳細はTIAのHelpを参考にしてください。 |
DETAIL | VARIANT | 使用しないでください |
Return Value
Variable Name | Type | Description |
RET_VAL | INT | 関数の状態 |
MODE
Mode | Description | DIAG |
0 | 該当するモジュールがSupportするModeを取得します。 | Bit0= Mode0 SupportBit1=Mode1 SupportBit2=Mode2 SupportBit3-31=Spare |
1 | 該当するモジュールの診断情報を取得する | DIS構造体MaintenanceStateComponentStateOwnStateIOStateOperatingState(TIA Help に参考) |
2 | 該当するモジュールのSubordinate部品情報を取得する | DNN構造体SubordinateStateSubordinateIOStateDNNMode(TIA Help に参考) |
Program
UDT
UDT_LED
こちらはLED関数の結果をまとめる構造体です。
UDT_IdevicesFromTwinCAT
こちらはTwinCATから受信したデータをまとめた構造体になります。
UDT_Idevices2TwinCAT
こちらはTwinCATに送信するデータをまとめた構造体になります。
Tags
Tags Tableを開き、先程I300.0とQ300.0をIdevicesのデータ領域を定義しましたね。AddressとData typeをあわせて変数を宣言しましょう。
DB
DB_SharedにTwinCATから受信するデータBufferとSTO Control のデータ・タイプも宣言します。
Function
FC_Get_LEDStatus
こちらのFunctionはLEDは関数から取得したLED Statusの現在値により該当するBitをTrueにします。
REGION init #FC_Get_LEDStatus.Color1_2_Flashing := False; #FC_Get_LEDStatus.Color1_Active := false; #FC_Get_LEDStatus.Color1Flashing := false; #FC_Get_LEDStatus.Color1ON := False; #FC_Get_LEDStatus.Color2_Active := False; #FC_Get_LEDStatus.Color2Flashing := False; #FC_Get_LEDStatus.Color2ON := False; #FC_Get_LEDStatus.FunctionError := false; #FC_Get_LEDStatus.NoExist := False; #FC_Get_LEDStatus.OFF := False; END_REGION REGION ReturnData CASE #LED OF 0,9: #FC_Get_LEDStatus.NoExist := True; 1: #FC_Get_LEDStatus.OFF := True; 2: #FC_Get_LEDStatus.Color1ON := True; 3: #FC_Get_LEDStatus.Color2ON := True; 4: #FC_Get_LEDStatus.Color1Flashing := True; 5: #FC_Get_LEDStatus.Color2Flashing := True; 6: #FC_Get_LEDStatus.Color1_2_Flashing := True; 7: #FC_Get_LEDStatus.Color1_Active := TRUE; 8: #FC_Get_LEDStatus.Color2_Active := TRUE; ELSE: #FC_Get_LEDStatus.FunctionError := True; ; END_CASE; END_REGION |
Function Block
FB_Data_Exchange_TwinCAT
こちらはTwinCATに送信・TwinCATから受信するFunction Blockになります。
ESTOPの状態>CPU RUN/STOP ・MAINT・ERROR LED状態>S210の診断情報>Profisafe 30の状態を順次に取得し、最後はTwinCATから受信したデータをBufferに転送し、他のプログラムで使用します。
REGION ESTOP #DataToTwinCAT.ESTOP1 := #ESTOP1; END_REGION REGION LED #LEDStatus.RUNSTOP := “FC_Get_LEDStatus”(LED := LED(LADDR := #CPUHW_IO, LED := #cLED_RUNSTOP)); #LEDStatus.ERROR := “FC_Get_LEDStatus”(LED := LED(LADDR := #CPUHW_IO, LED := #cLED_ERROR)); #LEDStatus.MAINT := “FC_Get_LEDStatus”(LED := LED(LADDR := #CPUHW_IO, LED := #cLED_Maint)); #DataToTwinCAT.CPU.RUN := #LEDStatus.RUNSTOP.Color1ON; #DataToTwinCAT.CPU.ERROR := #LEDStatus.ERROR.Color1Flashing OR #LEDStatus.ERROR.Color1ON; #DataToTwinCAT.CPU.MAINT := NOT #LEDStatus.MAINT.OFF; END_REGION REGION DIS #ReturnValue_GET_DIAG:=GET_DIAG(MODE := #CGET_DIAD_DIS, LADDR := #LADDR, CNT_DIAG => #CNT_DIAG, DIAG := #DIS); IF #SWAP THEN #DataToTwinCAT.DIS.ComponentStateDetail := SWAP(#DIS.ComponentStateDetail); #DataToTwinCAT.DIS.IOState := SWAP(#DIS.IOState); #DataToTwinCAT.DIS.MaintainanceState := SWAP(#DIS.MaintainanceState); #DataToTwinCAT.DIS.OperatingState := SWAP(#DIS.OperatingState); #DataToTwinCAT.DIS.OwnState := SWAP(#DIS.OwnState); END_IF; #DataToTwinCAT.CPU.internalEventAcknowledge := #Tlg30Status.internalEventAcknowledge; #DataToTwinCAT.CPU.STO := #Tlg30Status.STO; #DataToTwinCAT.CPU.SLS := #Tlg30Status.SLS; #DataToTwinCAT.CPU.SS1 := #Tlg30Status.SS1; #DataToTwinCAT.CPU.SLT := #Tlg30Status.SLT; END_REGION REGION DataFromTwinCAT #CommandsFromTwinCAT := #DataFromTwinCAT; END_REGION |
ADD OB1
次はOB1でそのFB_Data_Exchange_TwinCATを呼び出し、パラメータを振り分けます。
Safety
次はSafetyプログラムを修正します。本来Siemens S71200にあるLocalだけのリセットSignalを>=1 OR Blockを挿入し、TwinCATからのReset信号を入れます。
TelgramのControl StatusもTwinCATに転送します。
最後はACK_GL Function Blockを追加する。こちらはSafetyエラーをGlobalリセットするFunction Blockです。
TwinCAT3 Side
次はBeckhoff TwinCATに着手します。
Add S71200
Profinet Controller>右クリック>Add New Itemします。
Miscellaneous>PROFINET IO Deivceを選び>Okします。
先程ExportされたGSDML Fileを選び>Openします。
S7-1200が追加されました。
Change IP
Device TabからIP Configurationを設定します。前も記事にも書きましたが、ProfinetはIO ControllerからDevice nameによりIPを振り分けます。
Change Device Name
次はGeneral TabのName欄でDevice Nameを変更できます。
Mapping
S7-1200のAPIを展開すると、Transfer area_1とTransfer area_2があります。こちらはSiemensのTIAで設定したTransfer area名と同じです。
Program
DUT
DUT_Data_FromSiemens_DIS_ComponentStateDetail
こちらはSiemens S7-1200から受信したDISデータ構造のComponentStateDetail部分です。
TYPE DUT_Data_FromSiemens_DIS_ComponentStateDetail : STRUCT QualifiedDiagnosticsAvailable :BIT; MaintenanceRequired :BIT; ErrorRequired :BIT; HardwareAvailable :BIT; ApplicationReadyPending :BIT; LockedBySuperordinated :BIT; LockedByIOController :BIT; LockedByIOSupervisor :BIT; OK :BIT; Substitute :BIT; Wrong :BIT; NoSubmodule :BIT; ModuleDisable :BIT; CiROperationActive :BIT; InputNotAvailable :BIT; OutputNotAvailable :BIT; OverFlowDiagnosticsFlow :BIT; DiagnosticsNotAvailable :BIT; PartialDeviceFailure :BIT; _n1,_n2,_n3,_n4,_n5,_n6,_n7 :BIT; _n8,_n9,_n10,_n11,_n12,_n13 :BIT; END_STRUCT END_TYPE |
DUT_Data_FromSiemens_DIS_IOStates
こちらはSiemens S7-1200から受信したDISデータ構造のIOStates部分です。
TYPE DUT_Data_FromSiemens_DIS_IOStates : STRUCT Good :BIT; Disabled :BIT; MaintenanceRequired :BIT; MaintenanceDemanded :BIT; NotAccessible :BIT; QualifiedDiagnosticsAvailable :BIT; IODataNotAvailable :BIT; _n1 :BIT; END_STRUCT END_TYPE |
eDUT_DataFromSiemens_DIS_MaintenanceState
こちらはSiemens S7-1200から受信したDISデータ構造のMaintenanceState部分です。
{attribute ‘qualified_only’} {attribute ‘strict’} TYPE eDUT_DataFromSiemens_DIS_MaintenanceState : ( Good := 0 ,Disabled:=1 ,MaintenanceRequired:=5 ,MaintenanceDemanded:=6 ,Error:=7 ,StatusUnKnown:=8 ,IODataNotAvailable:=10 ); END_TYPE |
eDUT_DataFromSiemens_DIS_OperatingState
こちらはSiemens S7-1200から受信したDISデータ構造のOperatingState部分です。
{attribute ‘qualified_only’} {attribute ‘strict’} TYPE eDUT_DataFromSiemens_DIS_OperatingState : ( NotSupported :=0 ,Stop_FirmwareUpdate:=1 ,Stop_MemoryReset:=2 ,Stop_selfStart:=3 ,Stop:=4 ,MemoryReset:=5 ,Startup:=6 ,RUN:=8 ,RUNRedundant:=9 ,Hold :=10 ,Defect:=13 ,De_energized:=15 ,CiR:=16 ,STOPWithoutODIS:=17 ,RunODIS:=18 ,PgmTest:=19 ,RunPgmTest :=20 ,RunSyncup :=21 ,SYNCUP :=22 ,StatusUnknown:=31 ,StopSystemState:=33 ,StartUPSystemState:=35 ,RunSoloSystemState:=37 ,SYNCSystemState:=38 ,RunRedundantSystemState:=40 ); END_TYPE |
eDUT_DataFromSiemens_DIS_OwnState
こちらはSiemens S7-1200から受信したDISデータ構造のOwnState部分です。
{attribute ‘qualified_only’} {attribute ‘strict’} TYPE eDUT_DataFromSiemens_DIS_OwnState : ( Good := 0 ,Disabled:=1 ,MaintenanceRequired:=2 ,MaintenanceDemanded:=3 ,Error:=4 ,NotAccessible:=5 ,DiagnosticStatusUnknown:=6 ,IONotAvailable:=7 ); END_TYPE |
DUT_DataFromSiemens_DIS
先程定義したMaintenanceState・ComponentStateDetail・OwnState・IOState・OperatingStateをまとめたDIS構造です。DUTとして宣言したほうがUser programの中で使用しやすいです。
TYPE DUT_DataFromSiemens_DIS : STRUCT MaintenanceState :DWORD; //4bytes ComponentStateDetail:DWORD; //4bytes OwnState :UINT; //2bytes IOState :WORD; //2bytes OperatingState :UINT; //2bytes END_STRUCT END_TYPE |
DUT_DataFromSiemens_ESTOP
こちらはSiemens S7-1200から受信したESTOP状態部分です。
TYPE DUT_DataFromSiemens_ESTOP : STRUCT TimeSettingError :BIT; AckNotEnable :BIT; AckMissingEnable :BIT; AckRequired :BIT; QState :BIT; _NoUsed1 :BIT; _NoUsed2 :BIT; _NoUsed3 :BIT; State :BYTE; END_STRUCT END_TYPE |
DUT_DataFromSiemens_CPUStatus
こちらはSiemens S7-1200から受信したCPU状態とSTO状態部分です。
TYPE DUT_DataFromSiemens_CPUStatus : STRUCT STO :BIT; SS1 :BIT; SLS :BIT; SLT :BIT; internalEventAcknowledge:BIT; Run :BIT; ERROR :BIT; Maint :BIT; NotUsed :BYTE; END_STRUCT END_TYPE |
DUT_Data_FromSiemens
最後は全部をまとめ、20Byesに合わせるように調整します。
TYPE DUT_Data_FromSiemens : STRUCT ESTOP :DUT_DataFromSiemens_ESTOP; //2 bytes CPUStatus :DUT_DataFromSiemens_CPUStatus; //2 bytes S210 :DUT_DataFromSiemens_DIS; //14 bytes NotUsed :ARRAY[0..1]OF BYTE; END_STRUCT END_TYPE |
uDUT_DataFromSiemens
実際に紐つけるのはそのUNIONデータ・タイプの_raw部分です。
TYPE uDUT_DataFromSiemens : UNION _raw :ARRAY[0..19]OF BYTE; data :DUT_Data_FromSiemens; END_UNION END_TYPE |
Function Block
FB_DataFromSiemens EXTENDS FB_PnDevices_Status
TwincatやCodesysでプログラムするとき、一つ大きなメリットはFunction blockが拡張できることです。こちらのFB_DataFromSiemensは前回の記事で作ったProfinet IO Devicesを診断するFunction blockから拡張し、Siemens CPU S7-1200だけにあるデータを定義したり、出力したりします。
FUNCTION_BLOCK FB_DataFromSiemens EXTENDS FB_PnDevices_Status VAR_INPUT END_VAR VAR_OUTPUT CPUStatus :DUT_DataFromSiemens_CPUStatus; ESTOP :DUT_DataFromSiemens_ESTOP; S210OK :Bool; END_VAR VAR Data :DUT_Data_Siemens; END_VAR |
PROPERTY ComponentStateOK : Bool
Siemens S7-1200のDIS構造体にあるComponentStateOK部分から正常かをCheck行います。True=正常です。
VAR HardwareStatus:WORD; ElementStatus:WORD; StatusInformatioFromCPU:bool; END_VAR //Enum 7-10 //0: Own – Hardware component is available //1: Application Ready Pending – No I/O access //2: Locked by Superordinated – No access to hardware component //3: Locked by IOController – No access to hardware component //4: Locked by IOSupervisor – No access to hardware component HardwareStatus.0:=Data.DataFromSiemens.data.S210.ComponentStateDetail.7; HardwareStatus.1:=Data.DataFromSiemens.data.S210.ComponentStateDetail.8; HardwareStatus.2:=Data.DataFromSiemens.data.S210.ComponentStateDetail.9; HardwareStatus.3:=Data.DataFromSiemens.data.S210.ComponentStateDetail.10; //Enum 11-14 //0 (bit 11 = 0, bit 12 = 0, bit 13 = 0, bit 14 = 0): OK – The correct element exists. //1 (bit 11 = 1, bit 12 = 0, bit 13 = 0, bit 14 = 0): Substitute – The element was replaced by a compatible element //2 (bit 11 = 0, bit 12 = 1, bit 13 = 0, bit 14 = 0): Wrong – The element was replaced by an incompatible element (The element is reachable, but not ready for operation.). //3 (bit 11 = 1, bit 12 = 1, bit 13 = 0, bit 14 = 0): No Submodule – The element does not exist. ElementStatus.0:=Data.DataFromSiemens.data.S210.ComponentStateDetail.11; ElementStatus.1:=Data.DataFromSiemens.data.S210.ComponentStateDetail.12; ElementStatus.2:=Data.DataFromSiemens.data.S210.ComponentStateDetail.13; ElementStatus.3:=Data.DataFromSiemens.data.S210.ComponentStateDetail.14; //16-31 //BIT 16 = 1: Submodule OR module disabled //Bit 17 = 1: CiR operation active //Bit 18 = 1: Input not available //Bit 19 = 1: Output not available //Bit 20 = 1: Overflow diagnostics buffer //Bit 21 = 1: Diagnostics not available //Bit 22 = 1: Partial device failure (with PNIO for Shared iDevices) StatusInformatioFromCPU:=NOT Data.DataFromSiemens.data.S210.ComponentStateDetail.16 AND NOT Data.DataFromSiemens.data.S210.ComponentStateDetail.17 AND NOT Data.DataFromSiemens.data.S210.ComponentStateDetail.18 AND NOT Data.DataFromSiemens.data.S210.ComponentStateDetail.19 AND NOT Data.DataFromSiemens.data.S210.ComponentStateDetail.20 AND NOT Data.DataFromSiemens.data.S210.ComponentStateDetail.21 AND NOT Data.DataFromSiemens.data.S210.ComponentStateDetail.22 ; //Result ComponentStateOK:=HardwareStatus = 0 AND ElementStatus = 0 AND StatusInformatioFromCPU ; |
PROPERTY PUBLIC CPUOK : Bool
Siemens S7-1200のCPU状態部分から正常かをCheck行います。True=正常です。
CPUOK:=Data.DataFromSiemens.data.CPUStatus.Run; |
PROPERTY PUBLIC ESTOPOK : Bool
Siemens S7-1200のESTOP状態部分から正常かをCheck行います。True=正常です。
ESTOPOK:=Data.DataFromSiemens.data.ESTOP.QState; |
PROPERTY PUBLIC IOStateOK : Bool
Siemens S7-1200のDIS構造体にあるIOState部分から正常かをCheck行います。True=正常です。
IOStateOK:=Data.DataFromSiemens.data.S210.IOState.0;//Good |
PROPERTY MaintenancesStateOK : Bool
Siemens S7-1200のDIS構造体にあるMaintenanceState部分から正常かをCheck行います。True=正常です。
MaintenancesStateOK:=Data.DataFromSiemens.data.S210.MaintenanceState = eDUT_DataFromSiemens_DIS_MaintenanceState.Good; |
PROPERTY PUBLIC OperatingStateOK : Bool
Siemens S7-1200のDIS構造体にあるOperatingState部分から正常かをCheck行います。True=正常です。
OperatingStateOK:=Data.DataFromSiemens.data.S210.OperatingState = eDUT_DataFromSiemens_DIS_OperatingState.RUN OR Data.DataFromSiemens.data.S210.OperatingState = eDUT_DataFromSiemens_DIS_OperatingState.NotSupported; |
PROPERTY PUBLIC OwnStateOK : Bool
Siemens S7-1200のDIS構造体にあるOwnState部分から正常かをCheck行います。True=正常です。
OwnStateOK:=Data.DataFromSiemens.data.S210.OwnState = eDUT_DataFromSiemens_DIS_OwnState.Good; |
PROPERTY PUBLIC PNS210OK : Bool
最後は先程のPropertiesをまとめて使用し、S210の診断状態を出力します。True=正常です。
PNS210OK:=ComponentStateOK AND IOStateOK AND MaintenancesStateOK AND OperatingStateOK AND OwnStateOK; |
Reset
リセット信号をSiemensに送信します。
METHOD PUBLIC Reset : BOOL VAR_INPUT Execute :BOOL; END_VAR Data.DataToSiemens.data.OperCommands.Reset:=Execute; |
PROPERTY PUBLIC STOOK : Bool
Siemens S7-1200のDIS構造体にあるSTO部分から正常かをCheck行います。True=正常です。
STOOK:=Data.DataFromSiemens.data.CPUStatus.STO; |
MAIN
Main programで先定義したFunction blockを呼び出し、S210 Servo DriveのFunction BlockのEnable条件をS7-1200通信OKに追加します。
PROGRAM MAIN VAR Axis :AXIS_REF; END_VAR VAR PNController :FB_PNController_Status; PNDevices_S210 :FB_PnDevices_Status; PNDevices_S71200:FB_DataFromSiemens; S210 :FB_MyS210; Mode :eDUT_Mode; autocmd:BOOL; autosst :DINT; istep:DINT; TON :TON; END_VAR IF NOT PNDevices_S71200.STOOK THEN istep:=0; GVL_SystemHMI.PB.AutoStart:=FALSE; autosst:=0; END_IF GVL_SystemHMI.PL.ModeAuto:=GVL_SystemHMI.PB.Mode = eDUT_Mode.Auto; GVL_SystemHMI.PL.ModeManual:=GVL_SystemHMI.PB.Mode = eDUT_Mode.Manual; GVL_SystemHMI.PL.Reset:=GVL_SystemHMI.PB.Reset; GVL_SystemHMI.PL.PowerOn:=S210.qStatus.Operational; GVL_SystemHMI.PL.AutoStart:=istep<>0; IF GVL_SystemHMI.PL.ModeAuto THEN Mode:=eDUT_Mode.Auto; ELSIF GVL_SystemHMI.PL.ModeManual THEN Mode:=eDUT_Mode.Manual; END_IF; IF Mode=eDUT_Mode.Auto THEN CASE istep OF 0: TON(IN:=GVL_SystemHMI.PB.AutoStart,PT:=T#1S); IF TON.Q THEN istep:=10; TON(in:=False); END_IF 10: autosst:=1; IF S210.qActualStation = 1 THEN istep:=15; autosst:=0; END_IF 15: TON(in:=TRUE,PT:=T#1S); IF TON.Q THEN TON(in:=FALSE); istep:=20; END_IF; 20: autosst:=2; IF S210.qActualStation = 2 THEN istep:=10; autosst:=0; END_IF END_CASE ELSE istep:=0; autosst:=0; END_IF PNDevices_S71200.Reset(Execute:=GVL_SystemHMI.PB.Reset); S210.iPNComOK:=PNController.Ready AND PNDevices_S210.Ready AND PNDevices_S71200.Ready ; S210( iEnable:=TRUE ,bServoON:=GVL_SystemHMI.PB.PowerOn ,bReset:=GVL_SystemHMI.PB.Reset ,Mode:=Mode ,bILAbs:=TRUE ,bILJog:=TRUE ,bILAbs:=TRUE ,bAutoAbsCmd:=autocmd ,iAutoStationCmd:=autosst ,Hmis:=GVL.Hmis ); |
Link Variables
最後はS7-1200 PN IO Devicesの変数も紐付けるのを忘れずに。
Result
Beckhoff Twincat siemens S210 idevices communication, Structured Screen
Source Project
こちらのLinkからProjectをDownloadしてください。
Part3
https://github.com/soup01Threes/TwinCAT3/blob/main/Project-TwinCAT-S210-Part3.7z
Part4
https://github.com/soup01Threes/TwinCAT3/blob/main/Project-TwinCAT-S210-Part4.7z