HOME > ソフテックだより > 第233号(2015年5月6日発行) 技術レポート「PLCプログラムでのデータ取り扱い 〜文字列データ編〜」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第233号(2015年5月6日発行)
技術レポート

「PLCプログラムでのデータ取り扱い 〜文字列データ編〜」

1. はじめに

これまでソフテックだより第189号『PLCプログラムでの数値データ取り扱い 〜整数データ編〜』第199号『PLCプログラムでの数値データ取り扱い 〜実数データ編〜』をご紹介しましたが、今回は文字列データを扱ったPLCプログラムをご紹介したいと思います。

2. 文字コード

コンピュータ上で文字を扱うために、文字に対して割り当てられた数値のことを文字コードと呼びます。 文字コードにはいくつか種類があり、”ASCII(American standard code for information interchange)コード”、”JIS(Japan Industrial Standard)コード”、”シフトJIS(Shift JIS)コード”、”Unicode”などがあります。
最も基本的な文字コードとして普及しているのが”ASCIIコード”で、アルファベット/数字/記号などいわゆる半角英数字を1バイトで表したものとなります。また、日本語のようにカタカナ/ひらがな/漢字と数万種類もある文字を表す場合には、1文字を2バイトで表した”シフトJISコード”が用いられます。
以下は、ASCIIコード表です。例えば、文字で”0”〜”9”は、文字コードでは49(0x30)〜57(0x39)となります。(※赤背景は制御文字、緑背景のSPは空白文字(スペース)、青背景は図形文字)

ASCIIコード表
表1.ASCIIコード表

3. ラダープログラムで扱える文字列データ

PLCではASCIIコードとシフトJISコードを扱うことができ、文字はバイト(8ビット)単位で扱われ、先頭からNULLコード(0x00)までが1つの文字列として扱われます。シフトJISコードで漢字などの2バイト文字も扱えますが、2文字分としてカウントされます。 (シフトJISコードは2バイト目が0x00になることはないので、文字列の途中で終端とみなされることはありません)
また、PLCで使用するデバイスはWORD(16ビット)単位なので、WORDデバイスに2文字が格納される形になります。ただし各PLCメーカーによりエンディアン(データが格納される順序)が異なり、”ABC”というASCIIコードの文字列を格納した場合、以下のようになります。

メーカー 機種 文字列データ
三菱電機 Qシリーズ
 
H
L
1WORD目
0x42(B)
0x41(A)
2WORD目
0x00(NULL)
0x43(C)
横河電機 FA-M3シリーズ
 
H
L
1WORD目
0x41(A)
0x42(B)
2WORD目
0x43(C)
0x00(NULL)
オムロン CJシリーズ
 
H
L
1WORD目
0x41(A)
0x42(B)
2WORD目
0x43(C)
0x00(NULL)
キーエンス KV7000/5000/3000シリーズ
 
H
L
1WORD目
0x41(A)
0x42(B)
2WORD目
0x43(C)
0x00(NULL)

表2.主要PLCメーカー/機種での文字列データの扱われ方

4. デバイスコメントでデータ型を明確にする

前回まででもご紹介していますが、今回は数値データに加え、文字列データの場合のコメント例をご紹介します。
ラダープログラムに限らず、データを扱う上でデータ型は非常に重要です。
データ型を間違えて演算処理を行うと正しい結果が得られず、重大なトラブルに繋がる可能性もあります。 ソフテックでは、ラダープログラムで数値データを扱うとき、デバイスのコメントに、必ずデータ型を記載します。

データ型の記載ルールですが、演算命令に準拠すると分かりやすいと思います。
ラダープログラムの演算命令では、扱うデータ型をアルファベット1文字で表現することが一般的なので、そのアルファベットに使用する、というものです。
「アルファベット1文字+数字」で記載することができるので、デバイスコメントの文字数制限を圧迫することもありません。
文字列データの場合は、データ型だけでなく何文字目か?がわかるようにコメントを記載します。

図1にキーエンス製KV7000シリーズを使用した場合のデバイスコメントを示します。

デバイスコメント例
図1.デバイスコメント例

図1において、各デバイスで扱うデータは、以下となります。

D00000
…16ビット符号有りバイナリデータ
D00002
…16ビット符号無しバイナリデータ
D00004〜D00005
…32ビット符号有りバイナリデータ
D00007〜D00008
…32ビット符号無しバイナリデータ
D00010〜D00011
…単精度浮動小数点型実数データ
D00013〜D00016
…倍精度浮動小数点型実数
D00018〜D00020
…文字列データ

5. 文字列データの使用例

PLCでは数値データに比べると、文字列データを扱う機会は少ないですが、以下のような場合に文字列データを扱います。

5.1 通信データ

制御機器、計測機器などとシリアル通信やソケット通信によってやり取りを行う場合がありますが、 通信での送受信データは文字列データ(ASCIIコード)で扱われる場合が多いです。

以下は、バーコードリーダーの例です。 バーコードリーダーによって読み取ったデータをソケット通信にて受信します。

使用例:通信データ

図2.使用例:通信データ

5.2 ファイル処理

以前に比べてPLCも高機能化が進んできて、最近ではどのメーカーもPLC(CPU)にSDカードを装着してファイルを扱うこともできるようになりました。
文字コードだけで構成された文字列のデータをテキストと呼び、テキストだけを含むファイルはテキストファイルと呼ばれます。また、各項目のテキストをカンマ”,”で区切って列挙したテキスト形式のファイルはCSVファイルと呼ばれています。
以下は、PLCでの制御内容を決めるレシピ情報(テキスト)を保存したCSVファイルをPLCのSDカードから読み出して、画面表示している例です。

使用例:ファイル処理
図3.使用例:ファイル処理

6. ラダープログラムの作成例

6.1 モデル1 数値⇒文字列変換

モデル1では数値データを文字列データに変換するプログラムを作成してみます。
なおPLCはキーエンス製KV7000シリーズとします。

モデル1のデバイスコメントを図4に示します。
D0100に変換元の数値データ、D0105〜、D0110〜変換途中のワークデバイス、D0120〜に変換結果 文字列データをマッピングしています。

モデル1 デバイスコメント
図4.モデル1 デバイスコメント

モデル1では、元の数値データに対して除算をしていき、10000/1000/100/10/1の位のデータに分解しています。
そのラダープログラムを図5に示します。

モデル1 数値分解
図5.モデル1 数値分解

次に分解した数値データに対して、それぞれ0x30を足して文字列へと変換しています。

ポイント!

10000/1000/100/10/1の位に分解した数値データは、それぞれ0〜9の値となります。
また、ASCIIコードで“0”〜”9”は、バイナリデータでは0x30 〜 0x39となるため、それぞれに0x30を足してASCIIコードへと変換しています。

モデル1 数値⇒文字列 変換
図6.モデル1 数値⇒文字列 変換

PLCのデバイスはWORD単位(2バイト)ですが文字列はバイト単位で、先頭からNULLコード(0x00)までが1つの文字列として扱われます。そのため、5桁の文字列となるように文字列に変換したそれぞれの位のデータを連結していきます。

ポイント!

表2に記載しましたように、PLCメーカーによりWORDデバイスへの文字列格納方法が異なりますので、PLCメーカーに合わせた順番になるように格納していきます。

モデル1 各データ 連結
図7.モデル1 各データ 連結

6.2 モデル2 文字列⇒数値変換

モデル1とは逆に文字列データを数値データに変換するプログラムを作成してみます。
なおPLCはキーエンス製KV7000シリーズとします。

モデル2のデバイスコメントを図8に示します。
D0200〜に変換元の文字列データ(“123”)、D0205〜D0222に変換過程で使用するワークデバイス、D0225に変換結果の数値データをマッピングしています。

モデル2 デバイスコメント
図8.モデル2 デバイスコメント

モデル2では、まず文字列データを1WORDに1文字が格納されるよう分解しています。
そのラダープログラムを図9に示します。

ポイント!

表2に記載しましたように、PLCメーカーによりWORDデバイスへの文字列格納方法が異なりますので、PLCメーカーに合わせた順番になるように分解していきます。

モデル2 文字列 分解
図9.モデル2 文字列 分解

1文字ずつに分解したデータがそれぞれ数値変換可能か?(ASCIIコード:”0”(0x30)〜”9”(0x39)であるか?)をチェックしています。

ポイント!

通信など外部から受信するデータの場合、正しい数値文字列でないことも起こりうるので、変換可能かチェックを行っています。

モデル2 変換可チェック
図10.モデル2 変換可チェック

変換元データのチェックを終えたら、各データから0x30を引くことで数値データへと変換しています。
変換し終わったら、それぞれ×100、×10して合計することで1つの数値データとなります。

モデル2 文字列⇒数値 変換
図11.モデル2 文字列⇒数値 変換

6.3 モデル3 文字列⇒数値変換(スクリプト使用)

モデル2の例をラダープログラムではなく、スクリプトで記述したプログラムを作成してみます。
そのスクリプトプログラムを図12に示します。

ポイント!

ラダーでは基本的に1行で1つの文字列処理となりますが、スクリプトでは以下のように1行で複数の文字列処理を行うことが可能です。

モデル3 文字列⇒数値 変換(スクリプト)
図12.モデル3 文字列⇒数値 変換(スクリプト)

6.4 モデル4 文字列⇒数値変換(専用命令使用)

モデル2の例を専用命令(RDASC)で記述したプログラムを作成してみます。
そのスクリプトプログラムを図13に示します。

ポイント!

専用命令は便利ですが、数値変換できない文字列を変換しようとした場合に演算エラーとなってしまうので、変換前に変換可能かチェックを行っています。
また、各PLCメーカーでそれぞれ用意されている命令の種類や使い方が異なります。専用命令を使用する場合にはその命令の仕様をしっかり把握したうえで使用する必要があります。

モデル4 文字列⇒数値変換(専用命令)
図13.モデル4 文字列⇒数値変換(専用命令)

7. おわりに

いかがでしたでしょうか?
文字列を扱うにあたり、文字列⇔数値 変換命令があるので簡単なようで、モデル2のように文字列⇒数値変換を行う場合は、変換元の値によって変換できず演算エラーを起こすケースもあるので、データ型はきちんと意識する必要があります。また、基本的にラダープログラムは文字列の扱いは苦手です。
ファイルへの書込み文字列など、大きな文字列データを扱う場合はスクリプトを使用する事で簡単に扱えますので使用してみて頂ければと思います。
本稿が少しでも皆様のお役に立てていただければ幸いです。

(Y.R.)

[参考文献]
三菱電機 − MELSEC-Q/L プログラミングマニュアル(共通命令編)
横河電機 − シーケンスCPU 説明書 命令編
オムロン − CJ2 CPUユニットユーザーズマニュアルソフトウェア編
キーエンス − CKV-7000/5000/3000/1000 命令語リファレンスマニュアル

関連ページへのリンク

関連するソフテックだより

ページTOPへ