Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part6

Beckhoff TwinCAT x Siemens S210のPart6になりました。

前回はBeckhoff IPC のデータをWAGO PFC Controller 720-8215 Modbus TCP経由でWAGO CloudにUploadしましたが、今回はデータをLocal PCに貯めてみようと思っています。

構成ではBeckhoff TwinCATからTF6100でOPCUA Serverを立ち上げ、Phoenix Contact EPC1522内蔵のNode-REDからOPCUA のNodeを構造体としてまとめデータを取得し、InfluxDBに保存します。どうぞよろしくお願いします。

Thanks!

この記事が出来上がるのはベッコフ日本法人ベッコフオートメーション株式会社さま・Mana Design worksさま・フエニックス・コンタクトJapanさまから機材を貸してくださったおかけです。誠にありがとうございます。

ベッコフ日本法人ベッコフオートメーション株式会社

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/

フエニックス・コンタクトJapan

今回の記事で使用するEPC1522エッジPCはフエニックス・コンタクトJapanが貸してくださったものです。誠にありがとうございます。

フエニックス・コンタクトは1923年ドイツで設立、全世界55拠点、20,300名の従業員が働くグローバル企業です。

“All Electric Society”のコンセプトで、すべての産業セクターで包括的に電動化、ネットワーク化、自動化の実現などのソリューションを提供していくことを掲げています。産業用生産設備、インフラ、エネルギー、電子機器の接続など様々な用途にフエニックス・コンタクトの製品が使用されています。

日本のフエニックス・コンタクト株式会社は1987年12月に、アジアで初の現地法人として横浜で設立され、現在は国内10営業拠点で事業を展開しています。

HPはこちらです。

https://www.phoenixcontact.com/ja-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_Part5
Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part4
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_Part3

Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part2 |

Project#Beckhoff TwinCAT3 x Siemens S210 Servo Drvie_Part1 |

OPCUA

OPC UA Clients

ClientアプリケーションではOPCUA アクセスするために実装したもので、そのClient APIを使用しOPC ServerのServicesを受信・送信を行います。

注意するにはClient APIというのは内部のInterfaceであり、Client アプリケーションプログラムとOPC UA Communication Stackを分離するのが目的です。

OPC UA Communication StackもそのClient APIを利用しClientアプリケーションにOPCUA ServerのMessageを転送します。

Object Model

OPCUA Serverからみると、こちらのObject Modelは自分の”Object”を表現する一番標準的な方法になります。OPC UA Object ModelはまさにSoftware世界の”Object”の設計そのもので、中にVariables・Methodがあります。そしてObject間のReference も可能です。

Node Model

Node Modelはおそらく一番使うでしょう。

OPCUA ServerがAddress SpaceからObjectや関連情報を提供することによってOPC UA Clientから参照することができます。それは先程いったOPC UA Object Modelですね。

そしてObject自身には複数のNodesがあります。

Attributes

AttributesはNodes自身の情報が格納された部品で、OPCUA ClientはAttributeを読み書き・Query・Subscription・Monitorなどできます。各AttributesにもID、Attribute名、Data Typeの情報があります。

References

ReferencesはSoruceNode・TargetNode・Reference Typeの組み合わせです。

OPC UA Servers

こちらはOPC UA Serverのコンセプト図です。

Real Object

Real ObjectはOPCUA Serverアプリケーション中にアクセス可能なObjectですが、イメージ的にはあなたのプログラム変数などです。

OPC UA Server Application

Server アプリケーションはOPCUA Serverの機能を実装するCodeになり、OPCUA Server APIを使用しOPCUA ClientにOPC UA Messageを送受信します。

そのAPIは内部のInterfaceでServer アプリケーションCodeとOPC UA Communication Stackを分離するためのものです。

AddressSpace Nodes

AddressSpaceはServerが複数のNodesをModellingしClientからアクセスさせます。AddressSpace中にあるNodeは”Real Object”を表現します。

Built-in Types

Boolean

Booleanは1 Byteのデータで0(False)と0以外(True)を表現します。基本的に現在値を”1”でTrueを表現しますが、0以外の値でもTrueだと認めます。

Integer

すべての整数タイプもLittle-endian Formatで処理し、Significat BtyeはStreamの0 Byte目を対象にします。例えば、32Bitの整数1000000000はHexだと0x3B9ACA00で、Streamだと下記のように表現します。

Floating Point

すべてのFloating-point値はIEEE-754 に準じて表現します。つまりSign/Exponent/Fractionの3つの部品があります。そして無効値はすべてNaNになります。

String

すべてのStringはUTF-8文字で、文字列の長さはInt32で表します(−1の場合は”Null”文字列になります)。以下の例はOPCUAが”水Boy”を表現しています。

DateTime

Data Timeは64Bit Signed整数で表現され、100 nano secondでJanuary 1,1601(UTC)

から日付を表します。注意するのはすべての開発環境はそのData-Timeの範囲が必ずCoverできるわけでないんです。例えばUNIX time_t構造では1970以前の日付けと1sの精度で、OPCUAはDateTimeについて以下のルールを設けています。

  • もしDateTime変数が= 0なら、DateTimeは1601−01−01 12:00AM UTCか、またはその前か、、または開発環境が表現できる最小のDateTime値になります。
  • もしDateTime変数がInt64のMAX範囲なら、DateTimeは9999−12−31 11:59:59PM UTCか、または開発環境が表現できる最大のDateTime値になります。

ExtensionObject?

Extension ObjectはOPC-UAの大きな機能の一つであり、OPC UA Serverの変数をData Model化することができます。Extension Objectは”構造体”だとイメージでわかりやすいでしょう。例えば、Motorの中にSpeed・Positon・Statusなどいろいろな情報があり、それらをまとめて”Motr1″や”Motor2″でOPCUA Clientからアクセスできます。

Implementation-1 

ではまずBeckhoff TwinCATからOPC UA Serverを立ち上げ、UaExpertからアクセスしてみます。

Reference Link

Simumatik#Play With Beckhoff TwinCAT TF6100 OPCUA!

TwinCAT Side

Add DUT

DUTs>右クリック>New Folderで新しいFolderを追加します。それもTwinCATの一番よいところで、場所に限らず、好きな場所でFolderやDUT、POU、GVLを作成でき、データの管理面では便利です。

DUT_OPCUAというFolderが追加されました。

Folderを選び>右クリック>DUTでDUTを追加します。

DUT_Data_ToSiemens_OperCommands_OPCUA 

こちらはTwinCATがSiemensにIdevices経由で送るコマンドです。前回の記事も似てるDUTを作成しましたが、変数のData TypeをBITからBOOLに変えました。

TYPE DUT_Data_ToSiemens_OperCommands_OPCUA :
STRUCT
Reset :BOOL;
_n1,_n2,_n3,_n4,_n5,_n6,_n7:BOOL;
END_STRUCT
END_TYPE

DUT_Data_ToSiemens_OPCUA 

こちらはTwinCATがSiemensにIdevices経由で送るデータをまとめたDUTのOPCUA Versionです。

TYPE DUT_Data_ToSiemens_OPCUA :
STRUCT
OperCommands :DUT_Data_ToSiemens_OperCommands;
_NotUsed :ARRAY[0..18]OF BYTE;
END_STRUCT
END_TYPE

DUT_DataFromSiemens_CPUStatus_OPCUA 

こちらはSiemensがTwinCATにIdevices経由で送るCPU Statusです。前回の記事も似てるDUTを作成しましたが、変数のData TypeをBITからBOOLに変えました。

TYPE DUT_DataFromSiemens_CPUStatus_OPCUA :
STRUCT
STO :BOOL;
SS1 :BOOL;
SLS :BOOL;
SLT :BOOL;
internalEventAcknowledge:BOOL;
Run :BOOL;
ERROR :BOOL;
Maint :BOOL;
NotUsed :BOOL;
END_STRUCT
END_TYPE

DUT_DataFromSiemens_ESTOP_OPCUA 

こちらはSiemensがTwinCATにIdevices経由で送ESTOP Statusです。前回の記事も似てるDUTを作成しましたが、変数のData TypeをBITからBOOLに変えました。

TYPE DUT_DataFromSiemens_ESTOP_OPCUA :
STRUCT
TimeSettingError :BOOL;
AckNotEnable :BOOL;
AckMissingEnable :BOOL;
AckRequired :BOOL;
QState :BOOL;
_NoUsed1 :BOOL;
_NoUsed2 :BOOL;
_NoUsed3 :BOOL;
State :BYTE;
END_STRUCT
END_TYPE

DUT_OPCUA_S71200_OPCUA 

こちらはSiemensがTwinCATにIdevices経由で送るデータをまとめたDUTのOPCUA Versionです。

TYPE DUT_OPCUA_S71200_OPCUA :
STRUCT
operCommands:DUT_Data_ToSiemens_OPCUA;
ESTOP :DUT_DataFromSiemens_ESTOP_OPCUA;
CPUStatus :DUT_DataFromSiemens_CPUStatus_OPCUA;

END_STRUCT
END_TYPE

GVL

次はOPCUAのデータ交換用のGVLを作成します。

中に先ほど定義したDUTを変数として宣言します。

{attribute ‘qualified_only’}
VAR_GLOBAL
{attribute ‘OPC.UA.DA’ := ‘2’}
{attribute ‘OPC.UA.DA.StructuredType’ := ‘1’}
{attribute ‘OPC.UA.DA.Description’ := ‘Complex (structured) type ‘}
S210_1 :DUT_OPCUA_S210;
{attribute ‘OPC.UA.DA’ := ‘1’}
{attribute ‘OPC.UA.DA.StructuredType’ := ‘1’}
S71200 :DUT_OPCUA_S71200_OPCUA;
END_VAR

MAIN

S210やS7-1200のデータをOPCUA Serverの変数に転送します。

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;
Data :DUT_Data_Siemens;
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:=25;
autosst:=0;
END_IF
25:
TON(in:=TRUE,PT:=T#1S);
IF TON.Q THEN
TON(in:=FALSE);
istep:=30;
END_IF;
30:
autosst:=3;
IF S210.qActualStation = 3 THEN
istep:=35;
autosst:=0;
END_IF
35:
TON(in:=TRUE,PT:=T#1S);
IF TON.Q THEN
TON(in:=FALSE);
istep:=40;
END_IF;
40:
autosst:=4;
IF S210.qActualStation = 4 THEN
istep:=45;
autosst:=0;
END_IF
45:
TON(in:=TRUE,PT:=T#1S);
IF TON.Q THEN
TON(in:=FALSE);
istep:=50;
END_IF;
50:
autosst:=5;
IF S210.qActualStation = 5 THEN
istep:=55;
autosst:=0;
END_IF
55:
TON(in:=TRUE,PT:=T#1S);
IF TON.Q THEN
TON(in:=FALSE);
istep:=60;
END_IF;
60:
istep:=10;
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
);


GVL_Modbus.RealRegister[0]:=S210.qActualPosition;
GVL_Modbus.RealRegister[1]:=S210.qActualVelocity;
GVL_Modbus.WordRegister[0].0:=S210.qStatus.Error;
GVL_Modbus.WordRegister[1].0:=S210.qStatus.Operational;
GVL_Modbus.WordRegister[2].0:=S210.qStatus.NotMoving;;
GVL_Modbus.WordRegister[3]:=UDINT_TO_WORD(s210.qActualStation);

GVL_OPCUA.S210_1.Status:=S210.qStatus;
GVL_OPCUA.S210_1.ActualStation:=s210.qActualStation;
GVL_OPCUA.S210_1.ActualPosition:=S210.qActualPosition;
GVL_OPCUA.S210_1.ActualVelocity:=S210.qActualVelocity;
Data:=PNDevices_S71200.Data_Siemens;

GVL_OPCUA.S71200.CPUStatus.ERROR:=Data.DataFromSiemens.data.CPUStatus.ERROR;
GVL_OPCUA.S71200.CPUStatus.internalEventAcknowledge:=Data.DataFromSiemens.data.CPUStatus.internalEventAcknowledge;
GVL_OPCUA.S71200.CPUStatus.Maint:=Data.DataFromSiemens.data.CPUStatus.Maint;
GVL_OPCUA.S71200.CPUStatus.Run:=Data.DataFromSiemens.data.CPUStatus.Run;
GVL_OPCUA.S71200.CPUStatus.SLS:=Data.DataFromSiemens.data.CPUStatus.SLS;
GVL_OPCUA.S71200.CPUStatus.SLT:=Data.DataFromSiemens.data.CPUStatus.SLT;
GVL_OPCUA.S71200.CPUStatus.SS1:=Data.DataFromSiemens.data.CPUStatus.SS1;
GVL_OPCUA.S71200.CPUStatus.STO:=Data.DataFromSiemens.data.CPUStatus.STO;
GVL_OPCUA.S71200.ESTOP.AckMissingEnable:=Data.DataFromSiemens.data.ESTOP.AckMissingEnable;
GVL_OPCUA.S71200.ESTOP.AckRequired:=Data.DataFromSiemens.data.ESTOP.AckRequired;
GVL_OPCUA.S71200.ESTOP.QState:=Data.DataFromSiemens.data.ESTOP.QState;
GVL_OPCUA.S71200.ESTOP.TimeSettingError:=Data.DataFromSiemens.data.ESTOP.TimeSettingError;

POU_Modbus();

OPCUA Connectivity Project

Download and Install TF6100 Packages

下記のLinkからTF6100 PackagesをDownloadし、Installしてください。

https://www.beckhoff.com/en-en/products/automation/twincat/tfxxxx-twincat-3-functions/tf6xxx-tc3-connectivity/tf6100.html

TF6100 OPC UA Server

そのPackageにはTwinCAT OPC UA Serverと簡単なClient機能が含まれています。

TF6100 OPC UA Configurator

そのPackagesはTwinCAT OPC UA Configuratorで、Visual Studioの拡張機能やStandaloneアプリケーションが含まれています。

TF6100 OPC UA Gateway

そのPackagesにはTwinCAT OPC UA Gateway機能が含まれています。

Add Connectivity Project

次はOPCUA 構築するプロジェクトを追加します。File>New>Projectします。

Empty TwinCAT Connectivity Projectを選び>Okします。

Connectivity Projectが追加されました。

View>Toolbars>TwinCAT OPC UA Configuratorを有効します。

Add Device Type

Data Access>Add Device Typeします。

ADS Portを851に設定し、AMS Net IDを設定>Createします。

Data AccessにPLC_1が追加されました。

Connect

Edit ServerlistのDrop-listからOPC UA接続Serverを追加します。

Server Configuration画面が表示されます。

Add ServerでServerを追加します。

UaServer URLをopc.tcp://localhost:4840のままでOKです。Downloadはまた後ほどでやります。

Result

UaExpertでTwinCAT OPCUA Serverがちゃんと立ち上げたかを確認しましょう。

よし、問題なさそうですね。

{attribute ‘OPC.UA.DA’ }?

TwinCATプロジェクトのattribute ‘OPC.UA.DA’ は1と2に設定できます。簡単に言いますと、1=構造体にあるNodeはすべて可視化できる。2=構造体にあるNodeはすべて隠す。それだけではわからないので、実際のExampleを見てみましょう。

{attribute ‘qualified_only’}
VAR_GLOBAL
{attribute ‘OPC.UA.DA’ := ‘2’}
{attribute ‘OPC.UA.DA.StructuredType’ := ‘1’}
{attribute ‘OPC.UA.DA.Description’ := ‘Complex (structured) type ‘}
S210_1 :DUT_OPCUA_S210;
{attribute ‘OPC.UA.DA’ := ‘1’}
{attribute ‘OPC.UA.DA.StructuredType’ := ‘1’}
S71200 :DUT_OPCUA_S71200_OPCUA;
{attribute ‘OPC.UA.DA’ := ‘1’}
{attribute ‘OPC.UA.DA.StructuredType’ := ‘1’}
{attribute ‘OPC.UA.DA.Description’ := ‘Complex (structured) type ‘}
Test:DUT_OPCUA_S71200_OPCUA;
END_VAR

S210_1は{attribute ‘OPC.UA.DA’ =2}で、S71200は{attribute ‘OPC.UA.DA’ =1}です。S210_1とS71200も構造体ですが、UAExpertから見るとS71200変数のほうが中にあるCPUStatusなどの変数が見えますが、S210_1はそのNodeのみになります。

{attribute ‘OPC.UA.DA.Description’ := ‘Complex (structured) type ‘}

こちらのAttributeではNodeにDescriptionを追加できます。

Implementation-2

次はPhoenix Contact EPC1522中に内蔵されたNode-RedからOPC-UA 経由でBeckhoff TF6100のOPCUA Serverにアクセスしてみます。

Node-Red Side

TwinCAT側が準備OKなら次はNode-Red側をやりましょう。

OPCUA Node Version

こちらは自分のNode-red-contrib-opcua Versionで、一番新しいVersionを使用しましょう。

Add OPCUA Node

OpcUa-Clientを追加します。

Nodeが追加され、ダブルクリックで設定を行います。

EndpointをBeckhoffのOPCUA Serverに設定し、ActionはRead、Certificateは今回Noneで行います。

Add Inject Node 

次はInject Nodeを追加します。

Timestamp Nodeが追加されました。

ダブルクリックし、Nodeの設定を行います。

msg.topicはNode IDになり、UaExpertから変数のNode IDを確認できます。

よし、S71200・S210の2つの構造体変数もOKです。

最後はInject NodeをOPC UA Clientと繋がりましょう。

Add Switch

次はSwitch NodeをFlowに追加し、分岐を作成します。

Switchが作成されました。

ダブルクリックしSwitchの設定を行います。

条件1はもしmsg.topicはS210ならTrue、条件2はもしもしmsg.topicはS71200ならTrueになります。

OPCUA Cleint NodeのOutputをSwitchのInputと繋がりましょう。

Add Function

次はFunction Nodeを追加します。

Function Nodeをダブルクリックし、プログラムを追加します。

Node1

こちらはNodeのS210の処理です。OPCUA CleintがOPCUA Serverにアクセスし受信したExtension Objectからデータをバラします。

global.set(“S210”,msg.payload);

msg.payload = [
    {
        measurement: “Siemens-S210”,
                fields: {
                   
                    error                   :msg.payload.status.error | 0,
                    errorStop               :msg.payload.status.errorStop | 0,
                    softLimitMinExceeded    :msg.payload.status.softLimitMinExceeded| 0,
                    softLimitMaxExceeded    :msg.payload.status.softLimitMaxExceeded| 0,
                    errorID                 :msg.payload.status.errorID
                },
                tags:{
                    location:”Error”
                },
                timestamp: new Date()
            },
            {
                measurement: “Siemens-S210”,
                fields: {
                    motionState             :msg.payload.status.motionState ,
                    disabled                :msg.payload.status.disabled   | 0,
                    stopping                :msg.payload.status.stopping   | 0,
                    hasJob                  :msg.payload.status.hasJob     | 0,
                    inPositionArea          :msg.payload.status.inPositionArea     | 0,
                    inTargetPosition        :msg.payload.status.inTargetPosition     | 0,
                    homed                   :msg.payload.status.homed     | 0,
                    accelerating            :msg.payload.status.accelerating     | 0,
                    decelerating            :msg.payload.status.decelerating     | 0,
                    operational             :msg.payload.status.operational     | 0,
                    moving                  :msg.payload.status.moving     | 0,
                    notMoving               :msg.payload.status.notMoving     | 0,
                    actualStation           :msg.payload.actualStation,
                    actualVelocity          :msg.payload.actualVelocity,
                    actualPosition          :msg.payload.actualPosition,
                },
                tags:{
                    location:”Status”
                },
                timestamp: new Date()
            },

];

return msg;

Node2

こちらはNodeのS71200の処理です。OPCUA CleintがOPCUA Serverにアクセスし受信したExtension Objectからデータをバラします。

global.set(“S71200”,msg.payload);

msg.payload = [
    {
        measurement: “Siemens-S71200”,
                Commands: {
                   
                    reset                   :msg.payload.operCommands.reset | 0,

                },
                tags:{
                    location:”Commands”
                },
                timestamp: new Date()
            },
            {
                measurement: “Siemens-S71200”,
                fields: {
                    timeSettingError    :msg.payload.ESTOP.timeSettingError | 0,
                    ackNotEnable        :msg.payload.ESTOP.ackNotEnable | 0,
                    ackMissingEnable    :msg.payload.ESTOP.ackMissingEnable | 0,
                    ackRequired         :msg.payload.ESTOP.ackRequired | 0,
                    state               :msg.payload.ESTOP.state,
                },
                tags:{
                    location:”ESTOP”
                },
                timestamp: new Date()
            },
            {
                measurement: “Siemens-S71200”,
                fields: {
                    STO                     :msg.payload.cpUStatus.STO  | 0,
                    SS1                     :msg.payload.cpUStatus.SS1 | 0,
                    SLS                     :msg.payload.cpUStatus.SLS | 0,
                    SLT                     :msg.payload.cpUStatus.SLT | 0,
                    internalEventAcknowledge:msg.payload.cpUStatus.internalEventAcknowledge | 0,
                    run                     :msg.payload.cpUStatus.run | 0,
                    ERROR                   :msg.payload.cpUStatus.ERROR | 0,
                    maint                   :msg.payload.cpUStatus.maint | 0,
                },
                tags:{
                    location:”CPUStatus”
                },
                timestamp: new Date()
            },

];
return msg;

Switchの条件分岐でFunction1とFunction2の入力と繋がりましょう。

Add Debug

最後はDebug Nodeを追加し、FunctionのMsgを確認します。

Functionの出力とDebug Nodeを繋がりましょう。

ダブルクリックしDebug Nodeの設定を行います。Outputを”Complete msg object”に設定します。

Result

よし、OPCUA Serverのアクセスやデータ取得は問題ありませんね。

StatusCode=0なら、とりあえずNode自体は存在してることがわかります。

Implementation-3

次はDashboardを作成します。

Install Node

Manage Paletteをクリックします。

Node-red-dashboardを検索し、インストールしてください。

”Install”で進みます。

しばらく待ちます。。。

View logからインストールの進捗を確認できます。

Done!

DashboardのNodeが追加されました。

Add Flow

+Buttonで新しいFlowを追加します。

Flow1が追加されました。

Flow TabをダブルクリックしFlow名を変更しましょう。

Add Flow Variables

まずはFlow変数を定義します。実はImplementation2のFunctionでGlobal変数が定義され、OPCUA Serverから取得したデータをそのGlobal変数に転送しました。

このようにFlow変数を定義し、Globalから転送してもらいます。

flow.S71200=global.get(“S71200”);
flow.S210=global.get(“S210”);
msg.S71200=flow.S71200;
msg.S210=flow.S210;
return msg;

Add Dashboard

Dashboard用のNodeを追加します。

Result

よし、DashboardもOKでした。

こちらの動画で動作確認できます。

Implementation-4

最後はInfluxDBも一緒にSystemに連携していきます。

Reference Link

PLCNEXT#EPC edge PC Basic Startup
PLCNEXT#Play with Influxdb
PLCNEXT#Play with InfluxDB x telegraf
PLCNEXT#Using PLCnext Engineer with EPC Edge PC in IEC61131 Program

InfluxDB Side

Add Bucket

InfluxDBにアクセスし、Create Bucketで新しいBucketを追加します。

Bucket名を入力>Dataの保存期間を設定>Createで進みます。

MyDemoProjectのBucketが追加されました。

Configure API Tokens

次はInfluxDBのAPIにアクセスするためにAPI KEYを生成する必要があります。

Data>Tokensを開きます。

右にある”Generate Token”をクリックしToken生成します。

”Read/Write Token”でOKです。

そのAPI KEYがReadとWriteのできる範囲を設定し、Saveで保存します。今回の記事でScopedを選択し、API KEYを”MyDemoProject” Bucketのみ使用するようにします。

Done!API KEYが生成されました。

次は鉛筆ICONをクリックAPI KEY名を変更します。

よし、これでOKです。

次はAPI KEYをダブルクリックし、Copy to ClipboardボタンでAPI KEYを保存します。

Add Dashbord

表示用のDashboardを作成します。

右にあるCreate DashbaordでDashboard作成します。

New Dashboardを選び進みます。

Dashboardが作成されました。

Rename it

Dashboardを変わりやすい名前に変更しましょう。

Add Cell

Add Cellで表示項目を追加します。

Query作成画面に変わります。

Add Query

MyDemoProject Bucketからデータを選びます。

例えば現在のSpeed/Position/Stationを例にしましょう。

次はSubmitボタンでQueryを送信します。

よし、データが取れましたね!

最後は緑のCheckボタンでQueryを保存します。

Node-Red Side

Add Influxdb node

FlowにInfluxdb in Nodeを追加します。

OrganizationやBucketをInfluxDBの設定に合わせて設定します。

次はInfluxDB Serverの接続情報を設定します。

URLでInfluxDBのIP:8086を入力すると、Tokenは先程作成したAPI KEYになります。

設定完了したらUpdateします。

2つのFunction出力をそのInfluxDB Nodeと繋がりましょう。

Result

こちらから動作確認できます。

Source Code

こちらのLinkからプロジェクトをDownloadしましょう。

https://github.com/soup01Threes/TwinCAT3/blob/main/TwinCAT%20S210-part6.tnzip

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

シェアする

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

フォローする