【SCL编程案例】SWAP指令优化版

已锁定

BeautifulWorld

  • 帖子

    9
  • 精华

    0
  • 被关注

    5

论坛等级:游士

注册时间:2021-06-17

普通 普通 如何晋级?

【SCL编程案例】SWAP指令优化版

3957

3

2025-06-03 14:41:46

西门子SWAP功能只能固定对字节顺序进行交换,也就是12345678→87654321,有些时候需要的是78561234的顺序序列,此时实现起来相对麻烦一点,于是我开发了一个能够根据实际需求,进行两种顺序序列切换的SWAP优化版功能

子程序名称:SWAP_P

功能:可调整交换字节顺序类型的交换功能

硬件配置:S7-1200/S7-1500/S7-1200G2

软件版本:TIA Portal V16

说明:通过块生成源功能打开

输入:

In:Variant:待交换的数据

Mode:Bool:当交换DWord数据类型的字节时,根据信号状态切换输出字节顺序

【FALSE:1234→4321;TRUE:1234→3412】

输出:

Out:Variant:已交换的数据

注:当填写数据类型不正确(不是Word或者DWord)时,以及输入输出数据类型不同时,ENO为FALSE(需激活EN/ENO)


源代码:

//格式化输出

VariantPut(SRC := #tmpNullOut,

           DST := #Out);

//判断输入输出管脚数据类型是否一致

IF TypeOf(#In) = TypeOf(#Out) THEN

    //如果输入输出管脚数据类型一致,则case数据类型是Word还是DWord并执行相应的交换

    CASE TypeOf(#In) OF

        Word:

            //读取输入值到Word寄存器

            VariantGet(SRC := #In,

                       DST => #tmpInWord);

            //通过片段访问的形式对字节进行交换

            #tmpOutWord.%B0 := #tmpInWord.%B1;

            #tmpOutWord.%B1 := #tmpInWord.%B0;

            //把交换完毕的值写入输出

            VariantPut(SRC := #tmpOutWord,

                       DST := #Out);

        DWord:

            //根据模式决定交换顺序:FALSE:1234→4321;TRUE:1234→3412

            //其他方式与上述一致

            IF NOT #Mode THEN

                VariantGet(SRC := #In,

                           DST => #tmpInDWord);

                #tmpOutDWord.%B0 := #tmpInDWord.%B3;

                #tmpOutDWord.%B1 := #tmpInDWord.%B2;

                #tmpOutDWord.%B2 := #tmpInDWord.%B1;

                #tmpOutDWord.%B3 := #tmpInDWord.%B0;

                VariantPut(SRC := #tmpOutDWord,

                           DST := #Out);

            ELSE

                VariantGet(SRC := #In,

                           DST => #tmpInDWord);

                #tmpOutDWord.%B0 := #tmpInDWord.%B2;

                #tmpOutDWord.%B1 := #tmpInDWord.%B3;

                #tmpOutDWord.%B2 := #tmpInDWord.%B0;

                #tmpOutDWord.%B3 := #tmpInDWord.%B1;

                VariantPut(SRC := #tmpOutDWord,

                           DST := #Out);

            END_IF;

            //如果正确执行,则输出ENO

            ENO := TRUE;

        ELSE

            //如果数据类型不是WORD或者DWORD则不输出ENO

            ENO := FALSE;

    END_CASE;

ELSE

    //如果输入输出数据类型不相等则不输出ENO

    ENO := FALSE;

END_IF;

SWAP_P.7z

        


【SCL编程案例】SWAP指令优化版 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15772条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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