Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part4

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 様のホームページです。

どうぞよろしくお願いします。

https://mndw.jp/

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_Part3

Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part2 |

Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part1

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 NameTypeDescription
LADDRHW_IOHardware Interfaceの識別子、たとえばCPUの場合はCPU名+∼Commonになります。
LEDUINTLEDの識別子、1=STOP/RUN、2=Error、3=MAINT、5=Link、6=Rx/Tx
Return Value
Variable NameTypeDescription
RET_VALINTLEDの状態(詳しくTIAのHelpに参考してください)

GET_DIAG

こちらのGET_DIAG関数を使用すればハードウェア部品の診断情報を取得できます。MODEパラメタから取得したい診断情報も選択できます。ちなみに今回記事で使用するS7-1200ではMODE=0になるとLADDRのパラメータが無効になります。

今回の記事ではMode=1を使用します。Mode=1をすることによって関数の出力診断情報はDIS構造体に変わります。

VAR_INPUT
Variable NameTypeDescription
ModeUINT取得したい診断情報を選択する
LADDRHW_ANYハードウェア部品の識別子

VAR_OUTPUT

Variable NameTypeDescription
CNT_DIAGUINTAlways=0
LADDRHW_ANYハードウェア部品の識別子
VAR_IN_OUT
Variable NameTypeDescription
DIAGVARIANT診断情報、詳細はTIAのHelpを参考にしてください。
DETAILVARIANT使用しないでください
Return Value
Variable NameTypeDescription
RET_VALINT関数の状態
MODE
ModeDescriptionDIAG
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

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする