質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

3回答

6440閲覧

PLCのデバイス値をpythonで読み出したが、JSON形式で出力したい

zuizui_xp

総合スコア0

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/06 04:47

前提・実現したいこと

ラズパイからKEYENCE製PLCの上位リンクに接続し、センサーのデバイス値を取得するコードを作成、無事通信ができデバイス値も読み出すことができました。

読み出した結果をNord-Red上で次ノードへ送っているのですがmsg string形式のため数値を参照できません…
使用予定の次ノードはJSONオブジェクト内の「payload」の数値を参照するのですが変換方法が分からず困っています。

PLCより読みだしたデバイス値をstringではなくJSONオブジェクト・payloadの値として出力できれば解決できるとは思うのですが参っています

該当のソースコード

python
ソースコード

import

1 2host_ip = '192.168.1.70' # kv-8000のIPアドレス 3host_port = 8501 # 上位リンク通信ポート番号 4 5client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6client.connect((host_ip,host_port)) 7 8comand = "RD EM6027" #センサ読み出し 9separator = "\r" # 区切り符号CRの16進数表記 10msg = comand + separator 11 12client.send(msg.encode("ascii")) # 上位リンク通信のデータコードがASCIIなのでエンコード 13 14response = client.recv(1024) 15response = response.decode("UTF-8") # PLCからの返答がbyteデータなのでUTF-8にデコード 16 17client.close() 18 19return(response) 20 21 22### 試したこと 23 24・Nord-red内のJSONノードやchangeノードでの代入・置換 25・変換カスタムノードの検索 26![イメージ説明](3e7001f318f6970a0be9feb637d8e2a3.png)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/07/06 06:17

どうでもよい(よくない)ですが、正:"Node-RED" 誤:"Nord-Red" です。
guest

回答3

0

質問からだいぶ日にちが経っているので、解決されているかもですが、以前同じようなことをしたので、ご参考まで。
JSONはっておくので、インポートして使ってください。

処理内容としては、下の感じです。
①上位リンクコマンド作成
②httpリクエストノードでコマンド送信
③レスポンスをUTF-8化
④終端文字削除
⑤スペースで分割して配列化
⑥配列の中身を数値化
⑨スケーリング
IPアドレス、デバイス等は適当に改造してください。

[{"id":"aca38c38.f152c","type":"inject","z":"7bc3bc7.a939844","name":"AIアドレス設定(温湿度取得)","topic":"","payload":"AI,DM,25000,2","payloadType":"str","repeat":"","crontab":"*/1 0-23 * * *","once":false,"onceDelay":"","x":500,"y":60,"wires":[["39ecd42d.b6235c"]]},{"id":"39ecd42d.b6235c","type":"function","z":"7bc3bc7.a939844","name":"KVコマンド作成","func":"arry = msg.payload.split(",");\ncommand = "RDS "+ arry[1]+arry[2] +".S " + arry[3] + "\r";\nmsg.payload = command ;\n\nd = new Date();\n//date_now = d.toLocaleString();\n\n\n\n//Unix時刻取得  ミリ秒で取得されるので、1000で割って四捨五入\ndate_second = Math.floor(d.getTime()/1000);\n\n//msg.d = d;\n//msg.date = date_now;\n//msg.time = date_second;\nmsg.time = date_second;\n\nreturn msg;","outputs":1,"noerr":0,"x":440,"y":140,"wires":[["c748627f.8234d"]]},{"id":"c748627f.8234d","type":"tcp request","z":"7bc3bc7.a939844","server":"192.168.100.124","port":"8501","out":"time","splitc":"100","name":"コマンド送信","x":440,"y":200,"wires":[["2f66a140.b04e0e"]]},{"id":"2f66a140.b04e0e","type":"function","z":"7bc3bc7.a939844","name":"取得データを配列化","func":"//UTF-8に変換\ntext = msg.payload.toString("UTF-8");\n\n//終端文字を削除\ntext = text.replace("\r\n","");\n\n//分割\narray = text.split(" ");\n\nmsg.payload = array;\n\nreturn msg;","outputs":1,"noerr":0,"x":460,"y":280,"wires":[["cefd3ac.ecf56c8"]]},{"id":"cefd3ac.ecf56c8","type":"function","z":"7bc3bc7.a939844","name":"温湿度","func":"//UTF-8に変換\n//text = msg.payload.toString("UTF-8");\n\n//終端文字を削除\n//text = text.replace("\r\n","");\n\n//分割\n//array = text.split(" ");\n\narray = msg.payload;\n\n//温度と湿度を計算\ntemperature = array[0]/10;\nhumidity = Number(array[1])/100;\n\n//objectに格納\nmsg.payload = {};\nmsg.payload.time = msg.time;\nmsg.payload.temperature = temperature;\nmsg.payload.humidity = humidity;\n\n\nreturn msg;","outputs":1,"noerr":0,"x":410,"y":440,"wires":[["497282f0.5a7c0c"]]}]

投稿2021/04/01 04:59

mazda_cx-8

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

return(response) の前に以下のコードを入れて、返り値をjsonにしてみてはいかがでしょうか?

javascript

1// response = "00288\r"; 2 3response.trim(); // これで改行っぽいの除去できるといいんですが。 4json = {payload: response}; 5 6return json;

あと、追加された画面写真で気になるのは、値の 00288 の後に改行コード(CR?)が入っているっぽいので
これもコード内で除去しておかないとうまく行かない気がします。

投稿2020/07/06 06:11

YakumoSaki

総合スコア2027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

msg string形式のため数値を参照できません…

って、具体的にどういう結果になるんでしょうか。

JSON形式といえども、しょせんはテキストファイルなので、読みだした数値を文字列にできないとどうしようもないと思いますが

投稿2020/07/06 04:53

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zuizui_xp

2020/07/06 05:05

ご回答いただきありがとうございます 読みだしたデバイス値(画像の00288)がstring形式で次ノードに送られています この次ノードはobject内のpayloadの値からチャートを作成するノードなのですが、形式が違うため(payloadが存在しない→undifind)使用できない状況です pythonで読み取ったデバイス値をオブジェクトpayloadの値として出力できれば動作するかと思うのですが、その方法が分からず止まっています PLC等のFA機器は触るのですが、プログラミングは素人でして要領の得ない質問をしてしまい申し訳ございません
y_waiwai

2020/07/06 05:12

ならその00228がデバイス値なんでしょう そのPLCのマニュアルなどで、通信内容がどういう意味を持つのかをみてください。 これが10進数なのか16進数なのか、 10進数ならそのまま228がその数値となりますが、16進数(HexaDecimal)なら、0x00228、10進数で552という数値となります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問