こんばんは、プログラミングが苦手な電気設計課の楠川です。

最近ではLXI(Ethernetを利用した計測機向けに標準化された通信規格)に対応した測定器が増えてきました。
(LXIについての詳細は菊水さんのページが面白い(?)です)
LXIの扱い方を覚えることで、測定器の値を簡単に読み込めるようになります。
また、プログラミングが苦手な人(私)でも、Node-REDを使うことで、ちょっとの手間で簡単にLXI対応プログラムが作れるようになりました。

業務で行っているアンテナ放射特性測定は測定ポイントが200以上あって記録が面倒くさい、ということで記事にしました。
面倒くさいのですが、Node-REDでLXIを操作することで測定器の値の読み取り・記録作業が1クリックで済ませられるようになりました。


Node-REDは想像以上に簡単に、実用的なプログラミングができます。
興味が出たらぜひ挑戦してみてください。

対象者
・ネットワークにある程度造詣がある
・Raspberry Piにある程度造詣がある
・Node-REDにある程度造詣がある
という方向けの資料となります。

対象物
・測定器:Rohde&Schwarz FSV (スペアナ@IPアドレス192.168.99.100)
・読み込むPC:Raspberry pi 4 (2020年頃のRaspberry Pi OSにNode-REDインストールしたもの)

LXI経由で測定器の値を読み込むには、
1.測定器とRaspberry piを接続する
2.測定器に命令を与える
を行う必要があります。

1.測定器とRaspberry Piを接続する

測定器とRaspberry piを接続するためには、
1-1. 物理的に接続して、
1-2. ネットワーク的に接続する
必要があります。

1-1. 物理的に接続する。

LANケーブルを刺しましょう。
今回は1-2でIPアドレス設定を行い、測定器とラズパイをストレートケーブルで直接接続しました。

1-2. ネットワーク的に接続する

1-2-1のとおりRaspberry piを固定IP設定にして、お互いが認識できるように設定しました。
接続方法は、環境によって異なります。
ご使用の測定器の仕様を確認して設定しましょう。

今回使用する測定器は、固定IPアドレス設定となっています。また、測定器にDHCP機能はありません。
そのため、Raspberry piのデフォルト設定のまま接続しても、IPアドレスが決まらずに接続することができません。
Raspberry piのIPアドレスを決定するために、Raspberry piを固定IP設定とします。

1-2-1. Raspberry PiのIPアドレス設定方法(固定IP設定)

sudo nano /etc/dhcpcd.conf

にて、

interface eth0
static ip_address=192.168.99.3/24
static routers=192.168.99.1
static domain_name_servers=192.168.99.1

を追記して再起動しました。
(下記「俺の技術メモ」さんのサイトを参考とさせていただきました)
http://xn--u9j0md1592aqmt715c.net/raspbian-ipaddress-config/

 

2.測定器に命令を与える

2-1.測定器の仕様を調べる

使いたい測定器はRohde&Schwarz FSVで、読み込みたい値はMarker1のY値です。
以下で使われているプロトコルと命令仕様について調べていきます。

 

2-1-1. 使用プロトコルについて

Rohde&Schwarzの測定器は5025ポートに対してtelnetで命令を与えるとのこと。
https://www.rohde-schwarz.com/jp/faq/telnet-faq_78704-29474.html

2-1-2. 命令について

Marker1の値を読むには、「CALC:MARK1:Y?」と与えれば良いことがわかります。
https://www.rohde-schwarz.com/webhelp/fsv_rsanalyzerhelp/Content/6f4e0c22985d4880.htm#ID_8c5c561c29ea10910a00206a00f90ab1-88a16d1329ea10910a00206a00ae8974-en-US

2-1-3. プロトコルと命令についてまとめ

ラズパイからTCPで192.168.99.100(測定器)の5025ポートに対してtelnetで
「CALC:MARK1:Y?¥n」
をペイロードすれば返答が帰ってくることがわかります。

2-2. Node-REDでプログラムする

Node-REDでプログラムします。

プログラム全体としては、
 ・マウスの左クリックが入力されたら、
 ・「CALC:MARK1:Y?¥n」を、
 ・TCPで、192.168.99.100の5025ポートに送り、
 ・返答をCSVに保存する
という流れになります

コード全体は2-2-5の通りです。

2-2-1. rpi mouseノードでマウスクリックをトリガに開始して、

2-2-2. functionノードにペイロードする内容を記載して、



msg.payload = ("calc:mark1:y?\n");
return msg;


2-2-3. tcp requestノードでペイロード先(スペアナ)を指定して、

IPアドレス:192.168.99.100
ポート:5025
戻り値:指定時間後100ms

 

2-2-4. fileノードで内容を受け取ります。

ですが、fileノードで受け取る前に、CSV形式で認識しやすいように整形します。
整形内容は下記のとおり、

2-2-4-1. functionノードで最終文字(改行コード)を削除して

msg.payload = msg.payload.slice(0,-1);
return msg;

2-2-4-2. functionノードで最後に「,」をつけて

msg.payload = msg.payload + ',';
return msg;

2-2-4-3. fileノードで改行なしで追記します。

/home/pi/Desktop/test.csv
に「メッセージの入力のたびに改行を追加」のチェックを外して設定しました。



本フローを作成することで、ラズパイのマウスの左クリックを押すごとに、デスクトップ上のtest.csvにMarker1のY値が追記されていきます。

2-2-5. フローのコード全体


[{"id":"262fbb50.ce1f34","type":"tab","label":"rohde-marker-read","disabled":false,"info":""},{"id":"9c16ccb5.74b73","type":"file","z":"262fbb50.ce1f34","name":"","filename":"/home/pi/Desktop/test.csv","appendNewline":true,"createDir":false,"overwriteFile":"false","encoding":"none","x":540,"y":380,"wires":[[]]},{"id":"25c79bc4.f23394","type":"rpi-mouse","z":"262fbb50.ce1f34","name":"","butt":"2","x":100,"y":380,"wires":[["90dda73a.3a3f48"]]},{"id":"90dda73a.3a3f48","type":"change","z":"262fbb50.ce1f34","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":310,"y":380,"wires":[["9c16ccb5.74b73"]]},{"id":"bd33c9b.689de38","type":"tcp request","z":"262fbb50.ce1f34","server":"192.168.99.100","port":"5025","out":"time","splitc":"100","name":"","x":290,"y":160,"wires":[["5428ba99.ab2db4"]]},{"id":"3ca6bc99.7296e4","type":"file","z":"262fbb50.ce1f34","name":"","filename":"/home/pi/Desktop/test.csv","appendNewline":false,"createDir":false,"overwriteFile":"false","encoding":"none","x":580,"y":280,"wires":[[]]},{"id":"24f1a11d.895f1e","type":"function","z":"262fbb50.ce1f34","name":"「,」追加","func":"msg.payload = msg.payload + ',';\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":560,"y":240,"wires":[["3ca6bc99.7296e4"]]},{"id":"5428ba99.ab2db4","type":"function","z":"262fbb50.ce1f34","name":"最終1文字(改行)削除","func":"msg.payload = msg.payload.slice(0,-1);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":380,"y":240,"wires":[["24f1a11d.895f1e"]]},{"id":"960060bd.91fe5","type":"function","z":"262fbb50.ce1f34","name":"calc:mark1:y?","func":"msg.payload = (\"calc:mark1:y?\\n\");\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","x":260,"y":80,"wires":[["bd33c9b.689de38"]]},{"id":"3369c888.2e6d28","type":"rpi-mouse","z":"262fbb50.ce1f34","name":"","butt":"1","x":90,"y":80,"wires":[["960060bd.91fe5"]]}]

denshi.clubさんのページを参考とさせていただきました。
https://www.denshi.club/pc/nodered/node-redtips.html


いやー、プログラムが作れると生産性が上がりますねーー
Node-REDのようなビジュアルプログラミングは、プログラミングが苦手な人間でも学習コストが安く済むので助かります!

SNS SHARE