ISaGRAF Ver.4の場合
標準演算子"ANY_TO_REAL" を使用して、文字列型を実数型のデータに変換することができますが、小数部分は失われます。また、数字以外の文字があらわれると、それ以降の文字は数字に変換されません。
例
123-> 123.0
123.456 -> 123.0
1/2 -> 1.0
5*8 -> 5.0
abc -> 0.0
対処方法としてはC言語ファンクションをつくってターゲットに実装するか、下記のようなの仕様のIECファンクションブロックを開発します。
<パラメータ>
パラメータ名
|
型
|
方向
|
コメント
|
StrInput | STRING(255) | 入力 | 変換元の文字列 |
RealOutput | REAL | 出力 | 変換後の実数 |
Status | BOOL | 出力 | 入力文字列を変換できなかった場合、FALSE |
Zero | BOOL | ローカル | 文字列の先頭が '0' の場合の値はTrue |
Minus | BOOL | ローカル | 文字列の先頭が '-' の場合の値はTrue |
TempString1 | STRING(255) | ローカル | - |
TempString2 | STRING(255) | ローカル | - |
TempReal1 | REAL | ローカル | - |
TempReal2 | REAL | ローカル | - |
TempReal3 | REAL | ローカル | - |
StrLength | DINT | ローカル | 入力文字列の長さ |
Index | DINT | ローカル | - |
Code | DINT | ローカル | アスキーコードチェック用 |
OneChar | STRING(2) | ローカル | - |
<プログラム(ST言語で記述)>
Status := TRUE; (* 文字列を実数型に変換できたかどうかのフラグ *) StrLength := MLEN(StrInput); If (StrLength = 0) then (* 空文字列? *)
Index := 0; While (Index < StrLength AND Status = TRUE) Do
Code := ASCII(StrInput, Index); if (Code <> 45 AND (* '-'マイナス記号でない *) Code <> 46) Then (* '.'小数点記号でない *)
if (Status) then
Zero := TRUE; Minus := FALSE; TempString2 := TempString1; While (Zero) Do
if (OneChar = '0') then
TempString2 := Delete(TempString2,1,1); (* '-'を削除 *)
If (Minus) then
TempReal1 := expt(10.0, (mlen(StrInput )-find(StrInput ,'.'))); TempReal2 := trunc(TempReal1); TempReal3 := ANY_TO_REAL(TempString2); RealOutput := TempReal3 / TempReal2;
|