回复:【实用FC系列】之一,数字转换为字符串

Zane

西门子1847工业学习平台

  • 帖子

    21459
  • 精华

    404
  • 被关注

    1508

论坛等级:至圣

注册时间:2003-06-06

钻石 钻石 如何晋级?

发布于 2025-09-28 21:46:28

3楼

展开查看
以下是引用yang9188在2025-09-23 10:07:06的发言 >0楼

    今天有时间,开辟一个新系列--“实用FC”。这个系列给出一些比较通用的功能。这些通用的功能可能在很多项目中都就用到。比如今天给的是“数字转换为字符”。

    数字可以是任意值类型。比如int,real等。FC的功能是把值转换为字符串。我的很多项目都会用到这个FC,应该是bug-free的。

    下图是使用该块的例子。

程序如下

FUNCTION "SECS_STD_Val2Str" : Void

{ S7_Optimized_Access := 'TRUE' }

VERSION : 0.1

   VAR_INPUT 

      Value : Variant;

   END_VAR


   VAR_OUTPUT 

      FaultCode : Int;

   END_VAR


   VAR_IN_OUT 

      Str : String;

   END_VAR


   VAR_TEMP 

      IsFloatType : Bool;

      Size : USInt;

      tempStr : String[30];

      Value_Sint : SInt;

      Value_Int : Int;

      Value_Dint : DInt;

      Value_Byte : Byte;

      Value_USint : USInt;

      Value_Word : Word;

      Value_UInt : UInt;

      Value_DWord : DWord;

      Value_UDint : UDInt;

      Value_Real : Real;

      Value_Lreal : LReal;

      Len : Int;

   END_VAR

BEGIN

REGION converter TO str

    #IsFloatType := FALSE;

    #FaultCode := 0;

    #Size := 30;

    #tempStr := '';

    CASE TypeOfElements(#Value) OF

        SInt:

            VariantGet(SRC := #Value,

                       DST => #Value_Sint);

            VAL_STRG(IN := #Value_Sint,

                     SIZE := #Size,

                     PREC := 0,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

        Int:

            VariantGet(SRC := #Value,

                       DST => #Value_Int);

            VAL_STRG(IN := #Value_Int,

                     SIZE := #Size,

                     PREC := 0,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

        DInt:

            VariantGet(SRC := #Value,

                       DST => #Value_Dint);

            VAL_STRG(IN := #Value_Dint,

                     SIZE := #Size,

                     PREC := 0,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

            

        Byte:

            VariantGet(SRC := #Value,

                       DST => #Value_Byte);

            #Value_USint := #Value_Byte;

            VAL_STRG(IN := #Value_USint,

                     SIZE := #Size,

                     PREC := 0,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

        USInt:

            VariantGet(SRC := #Value,

                       DST => #Value_USint);

            VAL_STRG(IN := #Value_USint,

                     SIZE := #Size,

                     PREC := 0,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

        Word:

            VariantGet(SRC := #Value,

                       DST => #Value_Word);

            #Value_UInt := #Value_Word;

            VAL_STRG(IN := #Value_UInt,

                     SIZE := #Size,

                     PREC := 0,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

        UInt:

            VariantGet(SRC := #Value,

                       DST => #Value_UInt);

            VAL_STRG(IN := #Value_UInt,

                     SIZE := #Size,

                     PREC := 0,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

        DWord:

            VariantGet(SRC := #Value,

                       DST => #Value_DWord);

            #Value_UDint := #Value_DWord;

            VAL_STRG(IN := #Value_UDint,

                     SIZE := #Size,

                     PREC := 0,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

        UDInt:

            VariantGet(SRC := #Value,

                       DST => #Value_UDint);

            VAL_STRG(IN := #Value_UDint,

                     SIZE := #Size,

                     PREC := 0,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

            

        Real:

            #IsFloatType := TRUE;

            VariantGet(SRC := #Value,

                       DST => #Value_Real);

            VAL_STRG(IN := #Value_Real,

                     SIZE := #Size,

                     PREC := 6,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

        LReal:

            #IsFloatType := TRUE;

            VariantGet(SRC := #Value,

                       DST => #Value_Lreal);

            VAL_STRG(IN := #Value_Lreal,

                     SIZE := #Size,

                     PREC := 15,

                     FORMAT := W#16#0000,

                     P := 1,

                     OUT => #tempStr);

        ELSE  // other data type

            #FaultCode := 01;

            RETURN;

    END_CASE;

    

    IF ENO = FALSE THEN

        #FaultCode := 02; //str too short OR Size too small

        RETURN;

    END_IF;

    

    

END_REGION

REGION del space in front

    

    WHILE #tempStr[1] = CHAR#' ' DO

        #tempStr := DELETE(IN := #tempStr, L := 1, P := 1);

    END_WHILE;

    //#tempStr := CONCAT(IN1 := ' ', IN2 := #tempStr);

    

END_REGION

REGION del 0 in tail

    IF #IsFloatType THEN

        #Len := LEN(#tempStr);

        WHILE #tempStr[#Len] = CHAR#'0' DO

            #tempStr := DELETE(IN := #tempStr, L := 1, P := #Len);

            #Len := LEN(#tempStr);

        END_WHILE;

        IF #tempStr[#Len] = CHAR#'.' THEN

            #tempStr := CONCAT(IN1 := #tempStr, IN2 := '0');

        END_IF;

    END_IF;

END_REGION

#Str := '';

#Str := #tempStr;

END_FUNCTION


    本FC中用到了VARIANT类型。这个类型是非常好用的类型,可以大大简化复杂项目中PLC软件的结构。


    如果各位同行觉得本篇有帮助,请点击“有帮助”。非常感谢。如果希望探讨其他领域的有关主题,也可以给我留言。


不会交流的人被冷落是很正常的,还是多从自身找找原因,关注你是情分,不理你是本分。

再说了,就一段程序,到不了怀才不遇的地步,

take it easy

Zane 注册自动化系统工程师 Always save before download
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

谈天说地

共有14244条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。