1.4种沿指令的区别是什么?
答:4种沿指令的区别见表5-13。
表5-13 沿指令的区别

2.为什么沿指令不生效?
答:可能原因如下:
1)沿指令的上一扫描周期变量使用了临时变量。
2)多处沿指令的上一扫描周期变量的地址重复。
3)沿指令的上一扫描周期变量的地址和其他地址冲突。
要求沿指令中上一扫描周期变量使用全局变量、FC/FB的INOUT、FB的静态变量。具体使用见表5-14。
表5-14 沿指令上周期扫描结果

3.为什么定时器不计时?
答:可能原因如下:
1)定时器的输入位需要有电平信号的跳变,定时器才会开始计时。如果保持不变的信号作为输入位是不会开始计时的。TP、TON、TONR需要IN从“0”变为“1”启动,TOF需要IN从“1”变为“0”启动。
2)定时器的背景数据块重复使用。
3)只有在定时器功能框的Q点或ET连接变量,或者在程序中使用背景DB(或IEC_TIMER类型的变量)中的Q点或者ET,定时器才会开始计时,并且更新定时时间,见表5-15。
表5-15 定时器使用

(续)

4.如何编程自复位定时器并产生脉冲?
答:正确答案见表5-16,同时附上两种常见错误编程方式。
原因:S7-1200CPU定时器的时间更新发生在定时器功能框的Q点或ET连接变量时,或者在程序中使用背景DB(或IEC_TIMER类型的变量)中的Q点或者ET时,即如果程序中多次使用同一背景DB的Q点,或者既使用定时器功能框的Q点或ET连接变量;又使用背景DB的Q点,这两种情况都会造成定时器在一个扫描周期内的多次更新,可能造成定时器不能正常使用的情况。
表5-16 自复位定时器示例

5.如何根据实际情况选择合适的移动(MOVE、MOVE_BLK、MOVE_BLK_VARIANT)指令?
答:正确答案见表5-17。
表5-17 推荐使用的移动指令

6.如何实现变长数组的处理?
答:有以下几种实现方法:
1)使用MOVE_BLK_VARIANT,如图5-1所示。
2)使用VariantGet和VariantPut,如图5-2所示。
3)定义接口为ARRAY[∗]数据类型,如图5-3所示。
以下程序完成相同的功能:INOUT为元素为INT类型的变长数组,在程序中使用FC21将数组的每个元素处理后送回INOUT。示例程序请参见随书光盘中的例程《Program》项目FC20_VARIANT、FC21、FC22_VARIANT_GET/PUT、FC23_ARRAY∗。(https://www.xing528.com)

图5-1 MOVE_BLK_VARIANT实现变长数组的处理程序

图5-2 VariantGet实现变长数组的处理程序
7.如何实现S7-1200CPU的间接寻址?
答:有以下几种方法:

图5-3 ARRAY[∗]实现变长数组的处理程序
1)使用数组的变量下标 该方法参见第4.6章节的常见问题5,以及下面的例1。
2)使用MOVE_BLK_VARIANT指令 该方法参见第5.1.11章节的常见问题6中例子。
3)使用PEEK/POKE指令 PEEK/POKE指令只能用于SCL中,并且只允许访问I区、Q区、M区、非优化访问的DB区,这种方式的间接寻址不关注变量的数据类型,只关注变量的绝对地址。
当指令中的引脚dbNumber(DB块号)、byteOffset(变量的字节地址)、bitOffset(位变量的位偏移量)为变量时,可以实现间接寻址。示例程序请参见随书光盘中的例程《Pro-gram》项目FC18_PEEK、FC19_POKE_BLK。
例1:将CPU集成I点(I0.0~I1.3),保存至BOOL数组,如图5-4所示。

图5-4 例1程序
例2:将DB1~DB10的每个DB块的第一个DBW0送入MW100~MW118,如图5-5所示。
8.如何将通过通信得到高低字颠倒的浮点数转换为正常浮点数?
答:例如通过MODBUSRTU,得到地址为40001和40002的两个Word变量,将这两个

图5-5 例2程序
Word变量数值交换后,当作一个DWord变量来使用,DWord_to_Real指令可以将其转换为对应的浮点数,如图5-6所示。读到的40001和40002组合为16#3A004680,将其通过ROL指令实现高低字颠倒后,得到16#46803A00,该数值通过DWord_to_Real指令,得到需要的浮点数值。

图5-6 DWord_to_Real程序
9.如何实现模拟量和工程量之间的互相转换?
答:将NORM_X和SCALE_X联合使用,可以实现模拟量输入转换为工程量,如图5-7所示,以及工程量转换为模拟量,如图5-8所示。

图5-7 模拟量输入转换为工程量程序示例

图5-8 工程量转换为模拟量输出程序示例
注意:
实例为输入输出范围为4~20mA或者0~5V等单极性模拟量,如果是±10V等双极性模拟量,需要将MIN引脚从0改为-27648。
10.如何测量程序的扫描周期?
答:在OB1的任意位置,使用如图5-9所示的程序,两边的变量均为LREAL类型,右边的输出即为程序的扫描周期,单位是秒,图中显示扫描周期为1.255ms。

图5-9 测量程序的扫描周期程序示例
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
