こちらの記事ではBeckhoff TwinCAT3とKeyence SR750をProfinet連携する手順を1から説明します。(Youtube Channelの Commentリクエストより)
さ、はじめよう!
Reference Video
Beckhoff.TwinCAT3 ProfinetとKeyence SR750を連携しよう
Beckhoff.Use Keyence SR750 with TwinCAT3 and Etherent/IP
Reference Link
PROFINET?
PROFINET は PI (PROFIBUS & PROFINET International)によって規定されたオープンな通信規格です。PROFINET と互換性のある機器 は、ベンダーに関係なく、PROFINET 互換機器はベンダーに関係なく通信できます。SR-750シリーズはコンフォーマンスクラスAに準拠し、サイクリック通信にも対応しています。
Cyclic communication
サイクリック通信は、更新時間間隔で通信を行うことで、数ms〜数十ms間隔の高速制御を可能にする。更新時間間隔で通信することで、数ms〜数十ms間隔の高速制御が可能。
SR-750シリーズは、通信を意識することなく、PLC内の変数やデバイスを参照・更新して制御することができます。 これにより、PLC 側のプログラムが簡単になります。
SR-750 シリーズを制御する場合は、サイクリック通信の更新時間を 8ms 以上に設定してください。また、最大読み取り長は246桁になります。
注意するのはサイクリック通信の通信周期やデータサイズなどの通信設定はPLC側で行い、
PROFINET機器を含む多数の機器を接続するネットワークでは、負荷が大きい場合、遅延やパケットロスが発生する可能性があります。運用前に十分な検証を行ってください。
Function Overview
Timing input control Controls
タイミング入力のON/OFFし、パラメータバンクを指定したタイミング入力が可能です。
Preset data control
リードOKデータをプリセットデータとして設定できます。
また、PLCからプリセットデータの登録・削除が可能です。
Tuning
パラメータバンクを指定してチューニングを行うことができる。
Data handshake
読み取りデータをPLCに書き込むかどうかを制御できる。
Error handling
本体で発生したエラーを確認することができます。
エラー要因を取り除いた後、SR-750シリーズをエラー状態から復帰させることができます。
Statistical information acquisition
読み取り回数、読み取りデータ更新回数を確認できる。
Operation status acquisition
読み取りデータを取得し、I/O状態やマーキング検証結果を確認することができます。
Operation flow with PROFINET
Step1:Check specifications
接続するPLCがPROFINET接続に対応しているかと入出力データの割り当て状況を確認してください。
Step2:Make the PROFINET communication setting f
SR-750シリーズとPROFINET接続する場合に設定します。
- IPアドレス
- サブネットマスク
- デフォルトゲートウェイ
- PROFINET通信の有効/無効
- PROFINETデバイス名、データ
- ハンドシェーク有効/無効
PROFINETデバイス名は、ネットワーク内で同じデバイス名
を設定する必要があり、SR-750シリーズに設定した仮IPアドレスではPROFINET通信ができません。PROFINET設定を本体のOSに転送した後、SR-750 シリーズ本体が再起動します。
Step3:Establish PROFINET communication.
SR-750の情報をPLCに登録する場合は、SR-750のGSDMLファイルを使用してください。
を使用してください。
Step4:Perform necessary tasks.
アプリケーションのテストを始めます。
Time chart
Implementation
Keyence Side
最初はキーエンスSR750側を設定します。
Communication Setting
AutoID Network Navigatorを起動し、Communication2のTabで通信設定を行います。
ProtocolをPROFINETに設定し、Detailsをクリックします。
SR-750のデバイス名を設定します。
Send Configuration
SR-750のセットアップを完了したら、Transfer>Send Configurationでプロジェクトをデバイスに転送しましょう。
Beckhoff Side
次はBeckhoff TwinCAT3側を構築します。
Install GSDML
下記のLinkからKeyenceのHPでSR-750のGSDML FileをDownloadします。
https://www.keyence.co.jp/products/barcode/barcode-readers/sr-750/downloads/?mode=so&modelId=
下記のDirectoryにGSDML Fileを格納してください。
/TwinCAT/3.1/Config/Io/Profinet
Add Profinet RT Controller
I/O>Devices>右クリック>Add New Itemします。
Profinet I/O Controller(RT)を選び、OKで進みます。
Done!Profinet I/O Controller(RT)が追加されました。
Configure Adapter
Adapter TabでPROFINET Controllerとして使用するEthernet Intetfaceを設定してください。
Sync Task
Sync TaskでPROFINETのTaskタイムを設定しましょう。
Settings
最後はSettings TabでPN ControllerのIPとデバイス名を設定してください。
Set IP SettingsをクリックすればOKです。
Done!
Add SR-750
次はキーエンスのSR-750を追加するため、Profinet Controller>右クリック>Add New Itemします。
KEYENCE CORPORTATION>Sensor>Keyence Code Readerを選び、Okで進みます。
Done!
Term2-10は入力データで、Term11から15までは出力データになります。
Device Name
次はSR-750のデバイス名を設定しましょう。
IP Address
また、Profinetはデバイス名に沿ってIPアドレスを設定しますので、IPアドレスもアプリケーションに合わせて設定してください。
Add PLC
Fieldbusの設定が終わりましたので、次はPLCプログラムを作ります。
PLC>右クリック>Add New Itemします。
Standard PLC Projectを選び>Addします。
DUT
こちらはSR-750のProfinet構造に合わせて作成した構造体です。
DUT_SR750_PN_InData_Term2
こちらはSR-750の結果状態やエラーを示す構造体です。
TYPE DUT_SR750_PN_InData_Term2 : STRUCT Error:BIT; Result_Data_Available:BIT; Result_Data_Strobe:BIT; Buffer_Overflow_Error:BIT; General_Error:BIT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term3
こちらはSR-750のBusy状態を示す構造体です。
TYPE DUT_SR750_PN_InData_Term3 : STRUCT Busy:BIT; Try_Busy:BIT; Lock_Busy:BIT; Mode_Busy:BIT; Err_Busy:BIT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term4
こちらはSR-750の動作完了状態を示す構造体です。
TYPE DUT_SR750_PN_InData_Term4 : STRUCT Read_Complete ,Preset_Complete ,Register_Present_Data_Complete ,Tune_Complete ,EXT_Request_Complete :BIT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term5
こちらはSR-750のエラー状態を示す構造体です。
TYPE DUT_SR750_PN_InData_Term5 : STRUCT Read_Failure ,Preset_Failure ,Register_Preset_Data_Failure ,Tune_Failure ,EXT_Request_Failure :BIT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term6
こちらはSR-750の入出力端子状態を示す構造体です。
TYPE DUT_SR750_PN_InData_Term6 : STRUCT IN1_Status ,IN2_Status ,OUT1_Status ,OUT2_Status ,OUT3_Status :BIT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term7
こちらはSR-750の環境状態を示す構造体です。
TYPE DUT_SR750_PN_InData_Term7 : STRUCT Unstable ,Matching_Level_Unstable ,ISO_IEC_15415_Unstable ,ISO_IECTR_29158_AIM_DPM_1_2006_Unstable ,SAE_AS9132_Unstable :BIT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term8
こちらもSR-750の環境状態を示す構造体です。
TYPE DUT_SR750_PN_InData_Term8 : STRUCT MatchingLevel ,ISO_IEC15415_Grade ,ISO_IEC_TR29158_Grade :UINT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term9
こちらはSR-750の操作結果やエラーコードを示す構造体です。
TYPE DUT_SR750_PN_InData_Term9 : STRUCT ReadResultCode ,PresetResultCode ,RegisterPresetDataResultCode ,TuneResultCode ,RXTRequestResultCode ,GeneralErrorCode :UINT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term10
こちらはSR-750のBarcodeを読み取った結果を示す構造体です。
TYPE DUT_SR750_PN_InData_Term10 : STRUCT ResultDataReadyCount ,ResultDataUpdateCount ,ResultDataSize :UINT; ResultDat:ARRAY [0..127] OF BYTE; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term11
こちらはSR-750に対しエラーをクリアする構造体になります。
TYPE DUT_SR750_PN_InData_Term11 : STRUCT Result_Data_Latch ,ErrorClear :BIT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term12
こちらはSR-750に対し操作要求をする構造体になります。
TYPE DUT_SR750_PN_InData_Term12 : STRUCT Read_Request ,Preset_Request ,Register_Preset_Data_Request ,Tune_Request :BIT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term13
こちらはSR-750に対して操作結果をクリアする構造体になります。
TYPE DUT_SR750_PN_InData_Term13 : STRUCT Read_Complete_Clear ,Preset_Complete_Clear ,Register_Preset_Data_Compleite_Clera ,Tune_Comlete_Clear ,EXT_Request_Complete_Clear :BIT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term14
こちらはSR-750に送信するBank番号の構造体になります。
TYPE DUT_SR750_PN_InData_Term14 : STRUCT BankNumberRegister:UINT; END_STRUCT END_TYPE |
DUT_SR750_PN_InData_Term15
こちらはSR-750に送信するUser Dataの構造体になります。
TYPE DUT_SR750_PN_InData_Term15 : STRUCT UserDataSize:UINT; UserData:ARRAY[0..127]OF BYTE; END_STRUCT END_TYPE |
DUT_SR750_PN_InData
こちらは先ほど定義したSR-750から受信する構造体のまとめになります。
TYPE DUT_SR750_PN_InData : STRUCT Term2:DUT_SR750_PN_InData_Term2; Term3:DUT_SR750_PN_InData_Term3; Term4:DUT_SR750_PN_InData_Term4; Term5:DUT_SR750_PN_InData_Term5; Term6:DUT_SR750_PN_InData_Term6; Term7:DUT_SR750_PN_InData_Term7; Term8:DUT_SR750_PN_InData_Term8; Term9:DUT_SR750_PN_InData_Term9; Term10:DUT_SR750_PN_InData_Term10; END_STRUCT END_TYPE |
DUT_SR750_PN_OutData
こちらは先ほど定義したSR-750に送信する構造体のまとめになります。
TYPE DUT_SR750_PN_OutData : STRUCT Term11:DUT_SR750_PN_InData_Term11; Term12:DUT_SR750_PN_InData_Term12; Term13:DUT_SR750_PN_InData_Term13; Term14:DUT_SR750_PN_InData_Term14; Term15:DUT_SR750_PN_InData_Term15; END_STRUCT END_TYPE |
DUT_SR750_PN
最後は入出力をまとめれば完成です。
TYPE DUT_SR750_PN : STRUCT in AT %I*:DUT_SR750_PN_InData; Out AT %Q*:DUT_SR750_PN_OutData; PnIoBoxState,PnIoBoxDiag AT %I*:UINT; END_STRUCT END_TYPE |
GVL
Global Variable ListでキーエンスSR-750と通信する変数を定義します。
{attribute ‘qualified_only’} VAR_GLOBAL SR750_PN:DUT_SR750_PN; END_VAR |
Program
こちらは今回の記事のプログラムです。Function Blockを初期化し、Bar Codeを読み取ります。SR-750から完成Flagがない場合、3回Retryし、それでもだめの場合はエラーStepに移行します。もしSR-750から完成Flagがきた場合、結果を変数に転送します。
PROGRAM MAIN VAR Result:STRING; bRead:BOOL; CommStatus:BOOL; RetryCount:USINT:=3; CurrentCount:USINT:=0; CameraNotFailure:BOOL; iState:UINT; TON:TON; bReset:BOOL; ReadingTime:TIME:=T#1S; Error:BOOL; END_VAR CommStatus:= GVL.SR750_PN.PnIoBoxDiag=2 AND GVL.SR750_PN.PnIoBoxState=0; CameraNotFailure:= NOT GVL.SR750_PN.in.Term5.EXT_Request_Failure AND NOT GVL.SR750_PN.in.Term5.Preset_Failure AND NOT GVL.SR750_PN.in.Term5.Read_Failure AND NOT GVL.SR750_PN.in.Term5.Register_Preset_Data_Failure AND NOT GVL.SR750_PN.in.Term5.Tune_Failure AND NOT GVL.SR750_PN.in.Term2.General_Error ; CASE iState OF 0: CurrentCount:=0; TON(IN:=FALSE,PT:=ReadingTime); GVL.SR750_PN.Out.Term13.Read_Complete_Clear:=TRUE; Error:=FALSE; IF bRead AND CommStatus THEN iState:=5; END_IF 5: Result:=”; bReset:=FALSE; GVL.SR750_PN.Out.Term13.Read_Complete_Clear:=FALSE; iState:=10; 10: IF CameraNotFailure THEN iState:=20; ELSE iState:=990; END_IF 20: GVL.SR750_PN.Out.Term12.Read_Request:=TRUE; TON(IN:=TRUE); IF TON.Q THEN IF GVL.SR750_PN.in.Term4.Read_Complete AND NOT GVL.SR750_PN.in.Term5.Read_Failure THEN iState:=30; ELSIF GVL.SR750_PN.in.Term5.Read_Failure THEN iState:=200; END_IF TON(IN:=FALSE); GVL.SR750_PN.Out.Term12.Read_Request:=FALSE; END_IF 30: MEMMOVE( destAddr:=ADR(Result) ,srcAddr:=ADR(GVL.SR750_PN.in.Term10.ResultDat) ,n:=GVL.SR750_PN.in.Term10.ResultDataSize ); iState:=40; 40: GVL.SR750_PN.Out.Term13.Read_Complete_Clear:=TRUE; IF NOT GVL.SR750_PN.in.Term4.Read_Complete THEN GVL.SR750_PN.Out.Term13.Read_Complete_Clear:=FALSE; iState:=0; bRead:=FALSE; END_IF; 200: CurrentCount:=CurrentCount+1; IF CurrentCount > RetryCount THEN iState:=991; ELSE iState:=20; END_IF; 990,991: Error:=TRUE; bRead:=FALSE; IF bReset THEN iState:=0; END_IF; END_CASE GVL.SR750_PN.Out.Term11.ErrorClear:=bReset OR (iState=200); |
Link Input/Output
各SlotのProcess Input/OutputとUser Programの変数とLinkすることを忘れずに。
Download
最後はActivate ConfigurationでプロジェクトをRuntimeにDownloadします。
OKで進みます。
TwinCATをRun Modeに切り替えます。
Start
最後はStartボタンをクリックしRuntimeを開始します。
Result
SR-750では2次元コードを読み取れますね。
PnIoBoxState=2で、TwinCAT3とSR750間のProfinet通信が成立したことも確認できました。
PnIoBoxDiag=0で、TwinCAT3とSR750間のProfinet通信が成立したことも確認できました。
こちらの動画からSR750が読み取り失敗した場合の処理を確認できます。
Beckhoff.Using Profinet to communicate with Profinet SR-750(Error Case)
こちらの動画からSR750が読み取り失敗、そしてRetryし成功した場合の処理を確認できます。
Beckhoff.Using Profinet to communicate with Keyence SR-750(Retry and OK)
こちらの動画からSR750が読み取り成功した場合の処理を確認できます。
Beckhoff.Using Profinet to communicate with Profinet SR-750(Normal)
Download Project
こちらのLinkで今回の記事のプロジェクトをDownloadできます。
https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCATWithSR750_PN.tnzip