こちらは新しいシリーズで、Schmersal社のPSC1-C-100-FB1 Safety Controllerを利用し様々な記事を展開していきます。第7話はBeckhoff TwinCAT3とEtherCAT経由でデータ交換します。
さ、FAを楽しもう。
Reference Video
Schmersal.PSC1-C-100-FB1 開封しました!
Reference Link
http://soup01.com/ja/category/schmersal_jp/psc1/
EtherCAT
こちらはSchmersal社のPSC1-C-100-FB1 Safety ControllerのEtherCAT Slave仕様になります。
Implementation
こちらは今回の記事の構成です。
![](http://soup01.com/wp-content/uploads/2025/02/image.png)
Schmersal Side
最初にSchmersal側を構築していきます。
Configure EtherCAT Slave
PSC1-C-100-FB1 Safety ControllerでEtherCAT Interfaceを有効にするために、コントローラーをクリックします。
Properties画面にあるLocal Network>FieldbusのCheckboxを入れます。
プロジェクトのLocal Network TabにFieldbusの表示が増えます。
次はLocal Network>Fieldbusをクリックします。
Properties>Network>TypeでEtherCATを設定します。
Done!
今回記事で使用したDevice ProfileはProfile 1 (Only logic data)になります。
Safety Program
次は安全プログラムを作成します。前回のPart6記事に続き、プログラムをわかりやすく分類するために機能ことにFunctional Sheetsを作成します。
- Sheet00-INPUTS;入力データをまとめるSheetです。
- Sheet-Programs;Door Lockなどのロジックが含まれたSheetです。
- Sheet-OUTPUTS:出力をまとめるSheetです。
Sheetを追加するにはFunctional Sheets>右クリック>Add New Sheetしてください。
Done!
Sheet-INPUTS
Sheet-INPUTSは各安全・非安全入出力とEtherCAT Fieldbus経由で受信したリセット可能信号を異なるTerminalに転送します。
Sheet-Programs
Sheet-Programsは安全入力から転送してきたTerminalを利用し、異なる安全ロジックを実行します。また、出力データをTerminalに転送します。
Sheet-Outputs
Sheet-Outputsは安全Controllerに接続された出力を制御し、またEtherCATネットワーク経由でBeckhoff TwinCAT3に送信します。
Add Comments
SafetyPLC2ツールのプログラムにコメントをつけたい場合は、Sheetの空き場所に右クリックInsert Textしてください。
Connect to the Controller
PSC1-C-100-FB1のCOM Portと専用ケーブルをPCに接続します。
SafePLC2>Home>Device Interfaceをクリックします。
Connection Settingsをクリックします。
今回はRS-232ケーブルを使用するので、COM PortをDevice Managerに合わせて設定しましましょう。
最後はConnectボタンをクリックし、CPUとSafePLC2を接続しましょう。
OKで進みます。それでSafePLC2とPSC1-C-100-FB1を接続しました。
Send Configuration
Send Configurationをクリックし、プロジェクトをPSC1-C-100-FB1に転送しましょう。
しばらくお待ち下さい…
Beckhoff Side
次はBeckhoff側を構築します。
Download ESI File
EthernetCAT ネットワークを構築するには、Schmersal社のHPからEDSをDownloadしてください。
https://products.schmersal.com/en_IO/psc1-c-100-fb1-103008452.html
先ほどDownloadしたESI Fileを下記のDirectoryに格納してください。
(自分が使用してるのはTwinCAT3 4026です)
C:\Program Files (x86)\Beckhoff\TwinCAT\3.1\Config\Io\EtherCAT
Reload ESI File
TwinCAT3Wを起動し、Extensions>TwinCAT>EtherCAT Devices>Reload Device DescriptionsでESI Fileを再ロードします。
Add New Project
TwinCAT 4026を起動し、File>New>Projectで新しいプロジェクトを作成しましょう。
TwinCAT XAE Projectを選び、Nextで進みます。
プロジェクト名を設定し、Createで進みます。
Done!TwinCATプロジェクトが作成されました。
Add EtherCAT Master
EtherCAT Masterを追加するため、Device>Add New Itemします。
EtherCAT>EtherCAT Masterを追加します。
Done!EtherCAT Masterが追加されました。
Configure Adapter
EtherCAT Masterとして使用するEthernet Adapterを設定するためにAdapter Tabを開きます。
Searchをクリックし、実際に使用するEthernet Adapterを設定しましょう。
Scan Network
EtherCAT Masterを右クリック>ScanでネットワークにあるEtherCAT Slaveを検索します。
Done!今回記事で使用するPSC-C-100-FB1 Controllerを検索できました。
Add PLC
次はPLCプロジェクトを追加するため、PLC>右クリック>Add New Itemします。
Standard PLC Projectを選び>Addで進みます。
DUT
PSC1のデータをまとめる構造体を定義します。
DUT_PSC1_IN
こちらはSchmersal PSC1コントローラーの入力データをまとめた構造体です。
TYPE DUT_PSC1_IN : STRUCT uiAliveCounter :USINT; xAlwasyON :BOOL; uiPSCMode :USINT; uiDeviceAddressError :USINT; uiErrorCode :UINT; aLogicData :ARRAY[0..50]OF BYTE; bLogicData :ARRAY[0..407]OF BOOL; END_STRUCT END_TYPE |
DUT_PSC1_OUT
こちらはSchmersal PSC1コントローラーの出力データをまとめた構造体です。
TYPE DUT_PSC1_OUT : STRUCT aLogicData :ARRAY[0..31]OF BOOL; END_STRUCT END_TYPE |
DUT_PSC1
こちらは先ほど定義した入力データと出力データをまとめた構造体です。
TYPE DUT_PSC1 : STRUCT in :DUT_PSC1_IN; out :DUT_PSC1_OUT; _raw_in AT%I*:ARRAY[0..7]OF ARRAY[0..15]OF BYTE; _raw_Out AT%Q*:ARRAY[0..3]OF BYTE;; END_STRUCT END_TYPE |
GVL
次はGlobal Variable Listで先程定義した構造体で変数を作成します。
{attribute ‘qualified_only’} VAR_GLOBAL SlaveCount AT %I*:UINT; PSC1:DUT_PSC1; END_VAR |
FB_PSC
こちらのFunction BlockはSchmersal PSC-C-100-FB1のデータをEncodeできます。
FUNCTION_BLOCK FB_PSC VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR_IN_OUT ioData : DUT_PSC1; END_VAR VAR iCounter:INT; END_VAR |
//AlwaysOn from PSC ioData.in.xAlwasyON:=ioData._raw_in[0][0].4; //Operation mode ioData.in.uiPSCMode:=ioData._raw_in[0][0] AND 2#0000_0111; //AliveCounter ioData.in.uiAliveCounter:=ioData._raw_in[0][0] AND 2#1110_0000; ioData.in.uiAliveCounter:=SHR(ioData.in.uiAliveCounter,5); //Device Address Error ioData.in.uiDeviceAddressError:=ioData._raw_in[0][1]; //Error Code ioData.in.uiErrorCode:=SHL(TO_UINT(ioData._raw_in[0][3]),8); ioData.in.uiErrorCode:=ioData.in.uiErrorCode+ioData._raw_in[0][4]; //Logic InputData MEMMOVE( destAddr:=ADR(ioData.in.aLogicData[0]) ,srcAddr:=ADR(ioData._raw_in[0][5]) ,n:=51 ); FOR iCounter:=0 TO 50 DO ioData.in.bLogicData[iCounter*8+0]:=ioData.in.aLogicData[iCounter].0; ioData.in.bLogicData[iCounter*8+1]:=ioData.in.aLogicData[iCounter].1; ioData.in.bLogicData[iCounter*8+2]:=ioData.in.aLogicData[iCounter].2; ioData.in.bLogicData[iCounter*8+3]:=ioData.in.aLogicData[iCounter].3; ioData.in.bLogicData[iCounter*8+4]:=ioData.in.aLogicData[iCounter].4; ioData.in.bLogicData[iCounter*8+5]:=ioData.in.aLogicData[iCounter].5; ioData.in.bLogicData[iCounter*8+6]:=ioData.in.aLogicData[iCounter].6; ioData.in.bLogicData[iCounter*8+7]:=ioData.in.aLogicData[iCounter].7; END_FOR //Logic Input Data FOR iCounter:=0 TO 3 DO ioData._raw_Out[iCounter].0:=ioData.out.aLogicData[iCounter*8+0]; ioData._raw_Out[iCounter].1:=ioData.out.aLogicData[iCounter*8+1]; ioData._raw_Out[iCounter].2:=ioData.out.aLogicData[iCounter*8+2]; ioData._raw_Out[iCounter].3:=ioData.out.aLogicData[iCounter*8+3]; ioData._raw_Out[iCounter].4:=ioData.out.aLogicData[iCounter*8+4]; ioData._raw_Out[iCounter].5:=ioData.out.aLogicData[iCounter*8+5]; ioData._raw_Out[iCounter].6:=ioData.out.aLogicData[iCounter*8+6]; ioData._raw_Out[iCounter].7:=ioData.out.aLogicData[iCounter*8+7]; END_FOR |
MAIN
最後はMAINプログラムでFB_PSCのInstanceを定義し、非常停止などの状態・またリセット信号をSchmersal PSC-C-100-FB1から送受信できるようにします。
PROGRAM MAIN VAR xReset:BOOL; xSafetyEnable:BOOL; xSafetyOutputIsLocked:BOOL; xSafetyOutputed1:BOOL; xSafetyOutputed2:BOOL; xDoorOK:BOOL; xSafetyEStop:BOOL; xSafetyLightCurtain:BOOL; xDoorInPosition:BOOL; END_VAR VAR PSC1:FB_PSC; END_VAR |
GVL.PSC1.out.aLogicData[28]:=xReset; PSC1(ioData:=GVL.PSC1); xSafetyEnable:=GVL.PSC1.in.bLogicData[5]; xSafetyOutputIsLocked:=GVL.PSC1.in.bLogicData[73]; xSafetyOutputed1:=GVL.PSC1.in.bLogicData[146]; xSafetyOutputed2:=GVL.PSC1.in.bLogicData[209]; xDoorOK:=GVL.PSC1.in.bLogicData[407]; xSafetyEStop:=GVL.PSC1.in.bLogicData[0]; xSafetyLightCurtain:=GVL.PSC1.in.bLogicData[1]; xDoorInPosition:=GVL.PSC1.in.bLogicData[2]; |
Mapping
PSC-C-100-FB1とTwinCAT3間のProcess IOデータをMappingします。Functional Inputsは出力で、Diagnosisは入力になります。Functional Inputsをクリックしてください。
Functional Inputsを右クリック>Change Linkします。
先ほどGVLで定義した変数と接続します。
入力データ側では今回は最初の0-55Bytes目のみ使用しますので、Diagnosis Data0とDiagnosis1を選び>Change Linkをクリックします。
先ほどGVLで定義した変数と接続します。
Done!
Visualization
PSC-C-100-FB1と通信確認するために簡単なWeb画面を作成します。
Add Web Visualization
また、今回の記事ではBrowser上でBeckhoff TwinCAT3のWeb HMIをアクセスしますので、Visualization Manager>WebVisuを追加してください。
Active Configuration
TwinCAT プロジェクトをPLCにDonwloadします。
OKで進みます。
TwinCAT3をRun Modeに切り替えましょう。
Login
LoginでプログラムをDownloadします。
Yesで進みます。
最後はPlayボタンをクリックしPLCプログラムをスタートします。
Result
SchmersalのPSC-C-100-FB1 Safety controllerでは非常停止などの安全デバイスに状態を出力しています。
TwinCAT3側もそれらのデータを受信しましたし、リセット許可信号も送信できました。
下記のLinkからIP Addressを自分のTwinCAT3 PCのIP Addressに変更し、BrowserからBeckhoff TwinCAT3のWeb HMIにアクセスできると思います。
https://TwinCAT3 IP Address/Tc3PlcHmiWeb/Port_851/webvisu.htm
こちらの動画で動作を確認してください。
Schmersal.PSC1-C-100-FB1 with TwinCAT3 via EtherCAT Communication
こちらのLinkで今回記事で作成したプロジェクトをDownloadできます。
https://drive.google.com/file/d/1_Ic7vMHdk_tnWtKYgCNFSfBsQIJhiAk4/view?usp=sharing