「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
私は入社2年目になる八戸事業所勤務の社員です。普段の業務では主にPLCソフト開発を行っております。
昨今、製薬業界ではデータインテグリティ(DI)への対応が急がれており、紙媒体のデータからデジタルデータ管理への移行が進んでいます。
そのため、工場や研究所内の装置からデータ収集を行うことが多く、通信プログラムを作成する機会が増えています。
しかし、全ての装置がModbus RTU/TCP、TCP/IPなどの標準的な通信プロトコルに対応しているわけではなく、プリンタへの印字しかできない装置もあります。
今回はプリンタ印字出力のデータをPLCで受信し、データ取得をラダーで行う方法を紹介いたします。
この方法を用いてPLCと装置間の通信で取得したデータを上位システムに送信することができ、DI化を実現しました。
なぜ文字列処理が得意なST言語ではなくラダーで実装したかと言いますと、工程プログラム部分や電文の受信部などはラダーで記述された既存プログラムから流用したことと、
自分がST言語を使ったことがなく、ラダー経験のほうが圧倒的に多いからという2つの理由があります。
従来、分析機器での測定結果を取得するためにプリンタで測定結果を印刷していました。昨今進んでいるDI化に対応するにあたり、紙ではなく電子データで測定結果を取得することになりました。DI対応後は分析機器からプリンタに出力されていた印字データをPLCで受信し、文字列解析をかけた後、各データの格納デバイスにデータを格納し、SCADAにデータを通知します。
分析機器の測定結果の印字出力をシリアル通信で受信すると、1列分の出力電文は16文字+改行コード(CR LF)で構成されていることがわかります。表示としては列の前半部分に前詰めでデータ名、列の後半に後詰めでデータを表示しています。今回の印字出力18バイト×29列の計522バイトの固定長での出力を前提にプログラムを作成しました。図のASCIIは16進数のアスキーコードのことで、PLCで文字を照合する際に使用します。
以下は電文のフォーマット解析の為に作成した資料の抜粋になります。
通信の流れは次の通りです。
今回のプログラムの肝となる印字データ出力の受信処理について紹介します。
印字出力受信部のフローチャートを以下に示します。
大きく分けて「データ受信」「データ名照合・取出し」「格納データ反映」に分かれています。
分析機器からプリンタへの印字データ出力は1列分のデータが間隔をおいて出力されます。
通常、通信コマンドを使用してデータを受信する場合は一度に大量のデータが送ることができますが、
プリンタ出力の場合は印刷にかかる時間を考慮しているため、1列ずつ、通信的にはゆっくりと出力されます。
そのため、1列の出力ごとに1回の受信となります。
今回は29列分の電文を受信するため、分析装置から正常に印字出力された時、最低でも29回、印字データを受信します。
そのため、データ受信のタイムアウト時間は最後の印字出力から5秒と余裕を持つようにし、印字出力を取り逃さないように設定しました。
また、1行分の印字データ出力が2回にわかれて受信することを考慮し、受信データをWTOB命令を用いて1ワードに1バイトずつ文字列の分解を行いました。
この分解した文字列は後のデータ名照合、取り出しの工程で空ワードをDSFR命令を使用して1ワードシフト、BTOW命令を使用して結合を行います。
この処理を入れることで1行の出力が2回にわかれて受信した場合でも問題なくデータ名照合と取り出しを行うことができます。
データ名整合確認を行う前に先に説明したワードシフトと結合を行います。結合終了後、文字の整合確認と取り出しを行います。整合確認に使用するデータ名とデータについて紹介いたします。
1行分の印字データ出力のPLC上での扱いはワードごとに
と分けられます。
印字データ出力では列の前半部分に前詰めでデータ名を印字しているため、
この3つのワードがデータ名となります。
データは列の後半に後詰めで表示しており、
この3つのワードがデータとなります。
整合確認では受信した印字データ出力の中にの3つのワードが整合するか確認を行います。
先頭のから整合確認を行い、
の3つが一致し、機種名の整合が取れた時、機種名のデータ格納を開始します。
機種名の整合確認がとれた段階でより下位のデータは
となります。
このデータのうち、スペースを意味する以外のデータを格納します。
この格納も先頭から参照し、
以外のデータを機種名として格納します。
格納1行目の印字データの末尾を表す
を参照した時、機種名の印字データの参照を終了したと判断し、機種名参照完了のビットを立てます。
この整合確認を取得するデータ数分実施します。
参照するすべてのデータ項目の参照完了のビットが立ったことを確認後、データチェック完了とし、格納データの反映を行います。 反映された格納データはPLCからSCADAに送られ、製品のロット番号と紐付けられます。
本プログラムでは主に3つのエラー処理を行っております。各エラー処理共に3回リトライしても通信成功しない場合、エラーコードを発報し、プログラムを終了します。
それぞれの処理内容を紹介いたします。
分析機器はEthernet-RS232Cコンバーターを介してPLCと接続しており、ポートオープンしただけではコンバーターから先の分析機器との通信が確立しているか確認することができません。 そのため、PLCから分析装置に測定値を送信させるコマンドを送信し、測定値を受信することで通信確認を行います。 コマンドを送信しても3秒以上分析装置から応答がない、返答が返ってきても返答電文がフォーマットに沿っていない場合は分析装置との通信失敗と判断し、ポートオープン、コマンド送信をリトライします。
「データ受信」時、受信データ数が今回受信する印字出力の想定電文のデータ量である522バイト以下かつ、最終受信から5秒以上経過した場合、 受信失敗と判断し、ポートオープン、コマンド送信をリトライします。
「データ名照合・取出し」時、印字出力のデータ名の整合確認を行います。 整合確認時、取得するデータ名のうち、一つでも整合がとれなかった場合、印字出力の受信失敗と判断し、ポートオープン、コマンド送信をリトライします。
今回のプログラム作成で苦労したことは2つあります。
1つ目はデータ名の判定です。先ほど紹介した機種名の印字表示はであり、測定モード、測定条件名の印字表示の
とはじめの4文字が被ってしまい、測定モードのデータ取得を完了できませんでした。
プログラムを作り終わり、動作確認してみようと思い、受信想定の電文を読み込ませたところ、「なんかおかしい」となり、判明しました。
今回は対策として、機種名データのデータ取得完了後に測定モードのデータ取得を行うよう変更を行いました。
2つ目はデータの格納です。
先程説明した機種名の印字出力は1行でしたが、測定モード、測定条件や加熱パターンについては印字が2行に分かれているため、
1行目の読み込み完了後、文字の整合確認を行わずに2行目の読み込みを行うよう処理を追加する必要があり、その実装に苦労しました。
プリンタ印字出力から測定データを取得する方法について紹介しました。
今回の分析機器は印字データが固定長で列の末尾にがあったため、プログラム的に作りやすいと感じました。逆に印字データが可変長で、列の末尾に
がない場合、難易度が上がります。
今回の照合出力は1行の出力が
のように決められた文字数で、列の末尾にがついているため、どこまで格納すればいいのか判断がつき、その点においてはわかりやすい電文でした。
しかし、
のような電文だった場合、どこでデータが分かれているのかわかりにくく、難易度が高くなります。
WTOB命令を使用して1バイトごとに電文を分解し、1バイトずつ照合することでデータ収集は可能かと思いますが、手間がかかります。
通信プログラムは、通信する装置によって通信プロトコルに対応している場合や装置専用の通信コマンドが設定されていることが多いですが、今回は機器側がもっている通信仕様にあわせてプログラムを作成しました。通信状態の取得の仕組み、印字データを元にした受信電文の解析と必要なデータの取り出しする際の参考にしていただければ幸いです。
(S.O.)
関連ページへのリンク
関連するソフテックだより