文字列を実数型に変換することはできますか?


製品のバージョンによって異なります。


ISaGRAF Ver.4/5の場合
標準演算子 "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 (* 空文字列? *)
    Status := FALSE;
end_if;
Index := 0;
While (Index < StrLength AND Status = TRUE) Do
    Index := Index + 1;
    Code := ASCII(StrInput, Index);
    if (Code <> 45 AND (* '-'マイナス記号でない *)
    Code <> 46) Then (* '.'小数点記号でない *)
      If (Code < 48 OR Code > 58) Then (* '0'~'9'の文字でない *)
        Status := FALSE;
      End_If;
    End_If;
End_While;

if (Status) then
    TempString1 := replace(StrInput , '', 1, find(StrInput , '.'));
    Zero := TRUE;
    Minus := FALSE;
    TempString2 := TempString1;
    While (Zero) Do
      OneChar := Left(TempString2,1);
      if (OneChar = '0') then
        TempString2 := Delete(TempString2,1,1); (* '0'を削除 *)
      elsif (OneChar = '-') then
        Minus := TRUE;
        TempString2 := Delete(TempString2,1,1); (* '-'を削除 *)
      else
        Zero := FALSE; (* 最初の '0' ではない文字があった *)
      end_if;
    End_While;
    If (Minus) then
      TempString2 := Insert(TempString2,'-',1); (* '-' を戻す*)
    End_if;

    TempReal1 := expt(10.0, (mlen(StrInput )-find(StrInput ,'.')));
    TempReal2 := trunc(TempReal1);
    TempReal3 := ANY_TO_REAL(TempString2);
    RealOutput := TempReal3 / TempReal2;
Else
    RealOutput := 0.0;
End_If;
最終更新:
2008-07-30 10:46
改訂:
1.0
評価点数:0 (0 件の投票)
Chuck Norris has counted to infinity. Twice.

最も人気の FAQ RSS

  1. LD言語で、ある接点がFALSEの場合、それ以降のファンクションブロックを実行しないように出来るか? (44513 回の閲覧)
  2. SFC要素の「ステップ」と「トランジション」の意味と役割を教えてください。 (43415 回の閲覧)
  3. ISaGRAF WorkbenchをWindows 7で使用するにはどうしたらよいでしょうか? (40929 回の閲覧)
  4. ISaGRAFはIEC1131-3のシステム定義に準拠しているか? (38989 回の閲覧)
  5. PLCプログラムをより早く動かすにはどうすればよいですか? (38818 回の閲覧)
  6. LD言語で、立ち上がり・立ち下がりの出力はあるか? (36875 回の閲覧)
  7. VxWorksターゲットにおける変数管理の留意点について (36382 回の閲覧)
  8. 日立製作所製SHマイコン用コンパイラ使用時の注意事項 (35574 回の閲覧)
  9. Cファンクション/ファンクションブロックの"Hidden" パラメータとはどのようなものか (35525 回の閲覧)
  10. FBD/LD言語で同じ行に複数の演算がある場合の実行順序は? (33516 回の閲覧)

最近の FAQ RSS

  1. ファンクションブロックはネストできますか。 (2016-08-05 15:07)
  2. Cファンクション/ファンクションブロックの"Hidden" パラメータとはどのようなものか (2015-01-30 14:24)
  3. 前のISaGRAFで作成したプロジェクトをインポートしたら、コメントが文字化けを起こしています。 (2014-05-07 06:52)
  4. 前のバージョンで作成したプロジェクトは読み込めますか。 (2014-03-07 07:46)
  5. ISaGRAFでコンフィグレーション、リソースそれにPOUはそれぞれいくつ作成できますか。 (2014-03-07 02:06)