西门子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