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 様のホームページです。
どうぞよろしくお願いします。
フエニックス・コンタクト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_Part2 |
English Version
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
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してください。
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
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