今回の記事ではPI4にNode Redインストールし、そしてQR CodeをUSBカメラで認識させ同時にOPC UA Server立ち上げ、TwinCAT3 TF6100からアクセスし連携します。現時点で無料・気楽に試せるOPC UA ClientはおそらくTwinCAT3しかありませんので。
さ、はじめよう。
Camera
こちらは今回使用するLogi社の2500円のWeb Cameraです。
Configuration
手作り感半端ないですが、このようにWeb Cameraを使ってQR Codeを読み取りようにします。
Implementation
Operation Flow
こちらは今回の記事の制御Flowです。
Raspberry PI Side
最初はRaspberry PI側から構築します。
Check Camera
カメラが認識されたかを確認します。
lsusb
lsusbコマンドを使用し、現在Raspberry PIが認識されているUSBデバイスをリストアップします。
pi4@raspberrypi:~ $ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 003: ID 046d:0825 Logitech, Inc. Webcam C270 Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub |
https://www.baeldung.com/linux/check-for-usb-devices
grep
次はgrepコマンドを使用し、lsusbから出力した結果からWebcam C270(今回記事で使用するWebカメラ)だけを取り出します。
pi4@raspberrypi:~ $ lsusb | grep ‘Webcam C270’ Bus 001 Device 003: ID 046d:0825 Logitech, Inc. Webcam C270 |
https://phoenixnap.com/kb/grep-command-linux-unix-examples
Install Node-Red
次は下記の記事を参照しRaspberry PI4でNode-REDをインストールしましょう。
Node-Red Side
Node-Redのプログラムを作成します。
Install Node
最初に今回記事の中で使用するNodeを説明します。
node-red-contrib-opcua
こちらはOPC UA機能を実装したNodeです。
https://flows.nodered.org/node/node-red-contrib-opcua
下記のコマンドでnode-red-contrib-opcuaをインストールします。
npm install node-red-contrib-opcua |
node-red-contrib-opcuaをインストール完了したら、OPC UAのNodeが表示されます。
node-red-contrib-usb-camera
こちらはUSBカメラの操作を実装したNodeです。
https://flows.nodered.org/node/@prescient-devices/node-red-contrib-usb-camera
下記のコマンドでnode-red-contrib-usb-cameraをインストールします。
npm install @prescient–devices/node–red–contrib–usb–camera |
node-red-contrib-usb-cameraをインストール完了したら、usbcameraのNodeが表示されます。
node-red-contrib-qrdecode
こちらはQR CodeのDevodeを実装したNodeです。
https://flows.nodered.org/node/node-red-contrib-qrdecode
下記のコマンドでnode-red-contrib-qrdecodeをインストールします。
npm install node-red-contrib-qrdecode |
node-red-contrib-qrdecodeをインストール完了したら、qrcodeのNodeが表示されます。
Flow
ここからFlow作成の説明をします。
Configure OPC-UA Server
こちらはNode-RedからOPC UA Serverを立ち上げるFlowになります。
Read OPC UA Server Running Status
最初にStatus Nodeを使用し、OPC UA Serverが立ち上げたかをCheckします。
Status Nodeでは同じFlow Tabの中にあるNodeの状態を取得できますので、今回はNode-Red内にあるLocal Serverの状態をCheckします。
Check the OPC UA Server Status
先ほどのStatus NodeからLocal Serverを取得したので、次はswitch Nodeを使って条件判断の制御をします。
現在Status NodeのPayloadから”running”状態のみ、次のNodeに進めるようにします。
その”running”というのは、OPC UA Serverが正常に立ち上げたあと、Node-Redから”running”だと示したことです。
Configure Server Folder/Nodes
OPC UA Serverが立ち上げたことを確認できれば、次はOPC UA ServerにFolderやNodesを追加します。
Add Folder inside OPC UA Server
最初にFolderをOPC UA Serverに追加します。Folderを追加することにより、目的異なるNodeを分けてカタログ化できます。
topicはFolderの詳細で、payloadはFolderを追加するときに使用するコマンドです。
msg.topic =”ns=1;s=CameraOperation”; msg.payload = { “opcuaCommand”: “addFolder” }; return msg; |
先ほどのコマンドを実行したあと、uaExpertやTwinCAT3 TF6100を使ってOPC UA Serverにアクセスするとき、”CameraOperation”というFolderが作成されます。
Set the Folder
新しいNodeを先程追加されたFolderの下に作成したいので、Set Folderコマンドを使用します。
topicはこれから作業したいFolderの詳細で、payloadはSet Folderを設定するときに使用するコマンドです。
msg.topic =”ns=1;s=CameraOperation”; msg.payload = { “opcuaCommand”: “setFolder” }; return msg; |
Connect the OPC UA Server Node
次はFolder操作のNodeをOPC UA Server Nodeと繋がれば、OPC UA Serverが自動的にCameraOperationのFolderを作成し、またこれから作業するFolderをCameraOperationに設定するようになります。
Process Delay
Set FolderできるまでのDelayを設定します。
Node-REDではdelayのNodeを使用し動作遅延することができます。
今回は固定の4s Delayに設定します。
Add Variables into OPC UA Server
次はOPC UA Serverに変数を追加します。
基本的にはtopicで追加したい変数の詳細を入力し、payloadでaddVariableのコマンドを設定します。
他のNode変数も同じ操作だけなので、詳しく説明しません。
msg.topic =”ns=1;s=DoubleArray;datatype=DoubleArray[50];”; msg.payload = { “opcuaCommand”: “addVariable” }; return msg; |
Connect all Variables to OPC UA Server
アプリケーションに必要なNode変数をすべて構築したあと、Local Serverと繋がり、OPC UA ServerにNode変数を作成させます。
これでOPC UA Serverの構築は完了です。
Configure USB Camera
次はUSBカメラが動作し、QR CodeをDecodeするまでのFlowを説明します。
Read Trigger Command via OPC UA
OPC UA Clientからのコマンドを周期で読み取ります。
Inject Nodeから重複実行の時間などの細かい設定ができます。
Configure the reading Node
次はLocal OPC UA Serverに読み取りたいCameraコマンドを設定します。
OperationCommandを常にMonitorします。
Set up the OPC UA Server Connection
OPC UA ServerのNodeにアクセスするため、Local OPC UA Clientを追加します。
EndpointはLocalhostで、ActionをREADに設定します。
Trigger Camera Operation via Pulse UP
USB CAMERAの動作はOperationCommand値が0→1に変化する度のみ実行したいので、Node-RedにあるTrigger Nodeを利用します。
Trigger NodeをLocal OPC UA ClientのNodeの実行後と繋がりましょう。
Trigger条件成立するとPayload値を1に送信、該当するNodeはmsg.rest msgかpayload=0がくるとリセットします。
Check the Signal
次はswitch Nodeを追加し条件判断を行います。
switch Nodeは複数の条件判断を定義でき、今回は0と1だけ設定しましたが、0の場合はSwitch Nodeの上にあるFlowに流れていく、1の場合は下のFlowに流れるイメージです。
Reflesh the Server Status
USB CAMERAがTriggerされた場合、OPC UA にあるMessage/Status/Valueの3つの変数を一旦初期化します。そうするとOPC UA Serverと接続されているClientにも、CameraがTriggerされたことがわかります。
Setup Payload
各Function NodeにPayload Messageを設定します。
Function Message
var _msg=msg; _msg.payload=”Camera Operation is Triggerred.”; return _msg; |
Function Status
var _msg = msg; _msg.payload = -2; return _msg; |
Function Value
var _msg = msg; _msg.payload = ” “; return _msg; |
Passing payload to OPC UA Item
先ほどFunction Nodeで設定したPayload MessageをOPC UA Itemに設定します。
Configure Writing OPC UA Item
OPC UA Server書き込みたいのOPC UA Itemを設定しましょう。
こちらの設定は先程も説明しましたので、詳しく説明しません。
Write Data to OPC UA Server
次はOPC UA Clientを追加し、先ほど設定したOPC UA Itemと繋がりましょう。
OpcUa-Client NodeではEngpointをLocalHostに設定し、ActionをWRITEにしましょう。
Trigger the USB Camera
OPC UA Serverの変数Nodeを更新したあと、USB CAMERAの動作をTriggerするため、USBCAMERA Nodeを追加しましょう。
File ModeをBufferし、Image Resolutionを800×600くらいにしましょう。
Decode the Images
次はqrcode Nodeを追加し、usbcamera Nodeと接続します。
qrcode Nodeに設定する項目がありません。
Reflesh the Result
qrcode NodeのDecode結果をOPC UA ServerのNode変数に反映します。
qrcodeの出力とまた3つのFunction Nodeを繋がります。
Configure the payload
qrcode Nodeの結果をPayload Messageに設定します。
Function Message
var _paylod=msg.payload.message; var _msg=msg; _msg.payload=_paylod; return _msg; |
Function Status
var _paylod=msg.payload.status; var _msg=msg; _msg.payload=_paylod; return _msg; |
Function Value
var _paylod = msg.payload.value; var _msg = msg; _msg.payload = _paylod; return _msg; |
Configure OPC UA Item
Function NodeとOPC UA Itemを繋がります。
Opc-UA-Itemに更新したいNode変数を設定しましょう。
Write to OPC UA Server
最後はOPC UA ServerにNode変数を書き込むようにOPC UA Itemの出力と繋がりましょう。
Check the Camera Status
最後はUSBカメラの状態をCHECKするFlowを説明します。
Trigger
こちらは1sごとに重複実行するNodeです。
Execute Command
次はexec Nodeを追加しましょう。こちらのNodeを使用すればSystem Commandを実行できます。
記事の最初にも紹介した通り、こちらのコマンドでWebcam文字列を取り出します。
Check the result
Function Nodeを追加し、exec Nodeの実行結果を利用し、USB CAMERAの状態を反映します。
もしWebcam 270の文字があれば、Raspberry PIがUSB CAMERAを認識できると判断しますので、1を返します。それ以外は0を返します。
var str=msg.payload; var pos=str.search(‘Webcam C270’); var returnValue=0; if (pos>=0){ returnValue=1; } msg.payload=returnValue; return msg; |
Configure the OPC UA Item
OPC UA Serverに書き込むNodeを設定しましょう。
こちらの設定は先ほどにも説明しましたので。
Write the Data to OPC UA Server
OPC UA Serverにデータを書き込むようにします。これでRaspberry PI側が完了です。
Beckhoff Side
Install Packages
Beckhoff TwinCAT3でOPC UA Clientを使用するには下記のPackageをインストールしてください。
Add Devices
Devices>Add New Itemで新しいDevicesを追加します。
OPC UA>Virtual OPC UA Deviceを選び>Okします。
Add OPC UA Client
Device>Add New Itemで新しいOPC UA Clientを追加します。
OPC UA Client(Module)を追加しましょう。
SelectEndpoint
Raspberry PIの接続設定をするため、先程追加したClientをクリックします。
Select Endpointをクリックします。
Endpoint Discovery画面が表示されます。
Discovery UrlでRaspberryPIのOPC UA Server Endpointを入力しましょう。
RaspberryPIと接続するEndpointsを選びましょう。
Done!
Add Nodes
今回の記事で必要なNodeはすべてCameraOperationというFolderに格納されていますので、Enable WriteのCheckを入れて、OKで進みましょう。
Add PLC
PLCを右クリック>Add New Itemで新しいPLCプロジェクトを追加します。
Standard PLC Projectを選び、Addで進みます。
Create GVL
Create Plc Codeを利用しGVLを自動生成します。
Done!
MAIN
こちらはbSwitchがONになると、OperationCommandを1に書き込み、OFFになると0に書き込む簡単なプログラムです。
Screen
こちらはQR Codeの結果やTriggerするStart ボタンの簡単な画面です。
Activate Configuration
最後はActivate ConfigurationでプロジェクトをRuntimeにDownloadしましょう。
ライセンスが足りない場合はTrialライセンスを入力しましょう。
Magicのコードさえ入力すれば7日使えます。そして7日後Runtimeは1回Stopになり、もう1回Trialライセンスを有効にしましょう。
TwinCATをRun Modeに切り替えます。
Login
結果を監視するためLoginします。
Yesで進みます。
Start
StartボタンでRuntimeを起動します。
Write Enable
GVLにあるbWrite_EnableをTrueにします。また、bConnected=Trueなので、OPC UA Serverと正常に接続しています。
Result
こちらの動画で動作確認できます。