PLC程序移植中的字节顺序问题探讨

合集下载

plc字节高低位 -回复

plc字节高低位 -回复

plc字节高低位-回复PLC(可编程逻辑控制器)是一种常用于工业自动化控制系统的设备。

在PLC中,数据是以位、字或双字的形式进行处理和传输。

字节高低位是指字节中位的排列顺序,它在PLC中起着至关重要的作用。

本文将一步一步回答关于PLC字节高低位的问题,并解释其重要性以及如何正确配置PLC 以实现最佳性能。

首先,让我们来了解一下PLC中数据的基本组织方式。

在PLC中,数据是以二进制形式进行表示,每个位(bit)可以为0或1。

多个位组合在一起形成字节(byte),通常一个字节由8个位组成。

字节是PLC中数据处理和传输的基本单位。

然而,在PLC中,字节的排列方式有两种不同的方法:高位在前和低位在前。

高位在前指的是字节的最高有效位(Most Significant Bit,MSB)排在前面,而低位在前指的是最低有效位(Least Significant Bit,LSB)排在前面。

这个排列方式取决于PLC的硬件设计和配置。

为了更好地理解字节高低位的重要性,让我们考虑一个示例,假设我们需要控制一个工业设备的动作。

我们可以将不同的控制信号定义为PLC中的位,然后将这些位组合成字节,以实现更复杂的控制功能。

现在假设我们要控制一个电机的启停动作。

我们可以用一个位来表示电机的启停信号,例如0表示停止,1表示运行。

假设我们将这个位定义为字节中的最低有效位。

如果我们将该字节定义为低位在前方式,那么字节的二进制表示将是“00000001”,其中最低有效位为1,表示电机正在运行。

然而,如果我们将该字节定义为高位在前方式,那么字节的二进制表示将是“10000000”,其中最高有效位为1,表示电机正在运行。

这两种方式的定义将直接影响到PLC的编程和控制逻辑。

那么该如何正确配置PLC的字节高低位呢?首先,我们需要根据PLC的硬件设计和配置确定字节的高低位排列方式。

这通常可以在PLC的技术手册或用户手册中找到。

如果没有明确的说明,推荐的做法是遵循PLC制造商的建议,并与其技术支持团队进行咨询。

字节序的问题

字节序的问题

字节序简单介绍在编程中经常会涉及字节序的问题,大端、小端、网络序、主机序,总需要转换来转换去。

为了知道为什么转换以及何时需要转换,下面将字节序简单介绍下。

大端与小端内存中,每个字节(8-bit)对应着一个地址,地址从小到大排序。

在典型的32位系统中,一个char型的对应一个字节(byte=8-bit,此时不涉及字节序的问题),一个short型的对应着两个字节,一个int型的对应着4个字节,一个long 型的对应着8个字节。

大端(big endian):高位字节存储在低位地址中,从低地址看起,首先看到高位的字节,所以叫大端。

比如0x1122占两个字节,0x11是高位,放在低地址中,0x22是低位,放在高地址中;0x11223344占四个字节,从低地址到高地址依次是0x11、0x22、0x33、0x44。

一般对应于网络字节序和Sun工作站。

小端(little endian):高位字节存储在高地址中,低位字节存储在低地址存储单元中,从低位看起,首先看到低位字节,所以叫小端。

比如0x1122占两个字节,0x11是高位,放在高地址单元中,0x22是低位,放在低地址单元中;0x11223344占四个字节,从低地址到高地址依次存放0x44、0x33、0x22、0x11。

PC机一般是小端。

PC的bit序在程序中,编译之后,越先声明的变量的地址越低,结构体中也是如此,所以我们可以通过编辑程序研究字节序问题。

测试机器为Lenovo V450,ideapad系列。

#include <stdio.h>#include <stdlib.h>#include <string.h>struct onebyte{u_int8_t u1:1;u_int8_t u2:1;u_int8_t u3:1;u_int8_t u4:1;u_int8_t u5:1;u_int8_t u6:1;u_int8_t u7:1;u_int8_t u8:1;};int main(int argc, char *argv[]){u_int8_t a=atoi(argv[1]);struct onebyte *b;b = (struct onebyte *)(&a);printf("%d%d%d%d%d%d%d%d\n",b->u1,b->u2,b->u3,b->u4,b->u5,b->u6,b->u7,b->u8);return 1;}将程序一编译之后执行,得到如下结果:#include <stdio.h>#include <stdlib.h>#include <string.h>struct onebyte{u_int8_t u1:1; u_int8_t u2:1; u_int8_t u3:1; u_int8_t u4:1; u_int8_t u5:1;u_int8_t u6:1; u_int8_t u7:1; u_int8_t u8:1;u_int8_t u9:1; u_int8_t u10:1; u_int8_t u11:1; u_int8_t u12:1;u_int8_t u13:1; u_int8_t u14:1; u_int8_t u15:1; u_int8_t u16:1; };int main(int argc, char *argv[]){u_int16_t a=atoi(argv[1]);struct onebyte *b;b = (struct onebyte *)(&a);printf("%d%d%d%d%d%d%d%d\n%d%d%d%d%d%d%d%d\n",b->u1,b->u2,b->u3,b->u4,b->u5,b->u6,b->u7,b->u8,b->u9,b->u10,b->u11,b->u12,b->u13,b->u14,b->u15,b->u16);return 1;}编译执行,得到如下结果:从以上程序中可以推出。

plc的高低位转换原理

plc的高低位转换原理

plc的高低位转换原理PLC的高低位转换原理是指将数据从高位(MSB)转换为低位(LSB)或者从低位转换为高位的过程。

在计算机系统中,数据通常使用二进制表示。

其中,一个字节(byte)包含8个二进制位(bit),其中最高位是MSB,最低位是LSB。

高低位转换是指将一个字节中的位从MSB到LSB或从LSB到MSB重新排列。

PLC中的高低位转换主要应用于通信传输和数据存储方面。

例如,在通信传输中,常常需要将数据从一个设备传输到另一个设备。

由于不同设备的数据存储方式可能不同(例如,某些设备以高位优先(Big-Endian)方式存储数据,而另一些设备以低位优先(Little-Endian)方式存储数据),因此在传输数据之前需要进行高低位转换以保证数据的正确传输。

高低位转换的原理可以通过以下步骤进行:1. 将要转换的字节按照原始顺序从高位到低位或从低位到高位进行排列。

2. 创建一个新的字节变量,并按照目标顺序从高位到低位或从低位到高位依次将原始字节的位复制到新的字节变量中。

具体的转换方法可以通过位操作(bit manipulation)来实现。

例如,在C语言中可以使用位运算符(Bitwise Operator)进行高低位转换。

以下是一个将一个字节从高位到低位进行转换的示例代码:```cunsigned char originalByte = 0xAB; // 要转换的字节unsigned char convertedByte = 0; // 转换后的字节for(int i = 0; i < 8; i++) {convertedByte = (convertedByte << 1) | ((originalByte >> (7 - i)) & 0x01);}// 转换后的字节为0xD5```以上代码中,通过位移运算符将原始字节的位从高位到低位依次复制到转换后的字节变量中。

1200plc数据传输的字节规则

1200plc数据传输的字节规则

数据传输是现代信息技术中的重要环节,而在 PLC(可编程逻辑控制器)中,数据传输更是至关重要的一环。

本文将介绍在 PLC 中数据传输的字节规则,包括数据的存储方式、字节顺序、数据类型转换等方面的内容,旨在帮助读者更深入地理解 PLC 中的数据传输过程。

一、数据存储方式在 PLC 中,数据存储方式通常分为两种:小端存储和大端存储。

小端存储是指数据的低字节存储在内存的低位置区域处,而大端存储则是指数据的高字节存储在内存的低位置区域处。

在小端存储方式下,一个 16 位整数被存储为两个字节,低字节存储在低位置区域处,高字节存储在高位置区域处。

十进制数 300 的二进制表示为 xxx xxx,那么在小端存储下,数据被存储为 1100 0001 0000 0000。

而在大端存储方式下,同样是一个 16 位整数,低字节则存储在高位置区域处,高字节存储在低位置区域处。

以同样的例子来说,十进制数300 在大端存储下被存储为 0000 0000 1100 0001。

二、字节顺序在 PLC 中,字节顺序通常指的是多字节数据的存储顺序。

在多字节数据传输时,由于不同系统的存储方式不同,字节顺序可能会导致数据传输错误。

了解字节顺序对于数据传输的正确性至关重要。

在 PLC 中,多字节数据的字节顺序通常为大端顺序(Big-Endian)。

也就是说,多字节数据的高位字节存储在低位置区域处,而低位字节存储在高位置区域处。

这样的存储方式能够确保数据在不同系统之间的正确传输。

三、数据类型转换在 PLC 中,数据类型转换是数据传输过程中的一个重要环节。

不同的数据类型在传输时可能需要进行不同的处理,因此了解数据类型转换的规则对于数据传输的正确性至关重要。

1. 整数型数据在 PLC 中,整数型数据通常被存储为有符号数或无符号数。

有符号数的表示范围包括正数和负数,而无符号数则只表示正数。

在数据传输过程中,有符号数和无符号数的存储方式并无太大差异,但需要注意数据类型的范围是否符合数据传输的要求。

施耐德PLC编程应用案例与常见问题解决方案

施耐德PLC编程应用案例与常见问题解决方案

施耐德PLC编程应用案例与常见问题解决方案1.施耐德PLC编程软件自由通讯口设置以施耐德的SoMachine为例介绍以ICE61163-3为编程标准的PLC编程软件自由通讯口设置。

这是以PLC作为数据采集对象常用的通讯方式。

1、设置自由口通讯参数使用SL1端口,进行基本参数设置例如M218PLC有SL1和SL2两个串行通讯口,我们选择其中的SL1作为目标对象。

SL1采用RJ45接口,制作连接线时注意引脚关系以及电缆屏蔽。

2、接收数据帧格式选择可以选择起始字符和结束符的方式;可以通过判断数据帧长度的方式;可以通过帧收到超时(例如设置超时时间为5MS,则在收到最后一个字符后如果5MS内没有收到其他字符,则判断本帧结束)的方式判断帧的结束(实例中通过接收10个字节为一帧)ASCII管理器的配置参数介绍3、发送寄存器定义为字节的格式程序及相关数据,使用SEND_RECV_MSG功能块。

X5和X7定义为BYTE类型的数组。

(ADDM和SEND功能块说明见对应文章)4、设置发送(示例格式为16进制)X4=16#0A字节数,发送数据为X5数组里的10个字节5、设备收到的数据如下图所示,接收到的十个字节即为数组X5的十个字节6、设备发送的十个字节数据7、PLC收到的十个字节保存在接收区X7的是个寄存器中注意:如果将发送寄存器设置为INT格式,例如发送字寄存器数据16#1234,则设备收到的顺序为16#3412,即高低字节顺序问题。

2.施耐德plc%I %IW %M %MW是什么意思%I就是开关量输入,%IW就是模拟量输入,%M就是开关量输出,开关量的中间量也用%M,%MW就是模拟量输出,模拟量的中间量也用%MW。

3.施耐德PLC通讯的套路施耐德PLC通讯的套路就是三个功能块,ADDM ,READ_VAR,WRITE_VAR,下面分别介绍1 ADDMADDM功能块是地址转换,就是把PLC 的物理地址转换成PLC可识别的地址类型,这句话比较拗口,通俗讲,就是把字符串型变量,转换成ADDRESS 型变量,我们还是看例子图一 ADDM功能块如图一,图中红色圆圈内就是一个字符串型变量 '2,1' 第一个数字2表示PLC 的串口2,第二个数字1 表示读取的从站地址,也就是变频器的地址,而此功能块就是把此地址转换成ADDRESS型变量 A1_Add。

关于PLC控制系统及应用的探讨

关于PLC控制系统及应用的探讨


1 、端 口通信 方式 分类
( 1 )同步传输方式 采用同步传输时, 将许多字符组成一个信息组,这样 , 字符可以一个接 个的传输, 但是 , 在每簇信息的开始要加上同步字符 , 在没有信息要传输 时 ,要 填上 空字符 ,因为 同步传 输不 允许有 间 隙。在 同步 传输过 程 中 , 一 个 字符可以对应 5 - S b i t 。当然 , 对同一个传输过程,所有字符对应同样的比特 数 。这 样 ,传输 时 ,按每 n 个 比特 划分为 一个 时间 片 ,发送端 在一 个时 间片 中发送一个字符,接收端则在一个时间片中接收一个字符 。 ( 2)异步传输方式 异 步传输 方式 指 比特被 划分 成小组 独立 发送 。 发送 方可 以在 任何 时刻发 送这些 比特组, 而接收方不知道它们会在什么时候到达。异步传输存在一个 潜在的问题 , 即接收方并不知道数据会在什么时候到达。 在它检测到数据后, 并 且做 出响 应之前 , 第一 个 比特 己经过去 了 。因此这个 问题 需要 通过通 信协 议来解决。 如每次异步传输都以一个开始比特开头 , 它通知接收方数据已经 到达 。这就 给 了接收 方响应 ,接 收和缓 存 数据 比特 的时间 。在传 输结 束时 , 个停 止 比特表 示一 次传输 的终 止 。 ( 3 )两种 传输 方式 比较 从通信效率的角度看, 同步传输方式接收方不必对每个字符进行开始和 停止的操作 ,因此同步传输通信效率高,异步传输效率低。 2 、P L C自由 口模 式控 制 串行 口的方法 s 7 — 2 0 0系列 P L C在选择 自由端口模式时, 程序可以通过使用接收中断、 传输中断 、“ 传输”指令和 “ 接收”指令控制通讯端 口操作。通讯协议位于 自由端 口模 式 时完全 受梯 形 图程序 的控制 。 S M B 3 0( 用 于端 口 0) 和S MB 1 3 0 ( 用于端 口 1 ,如果 s 7 — 2 0 0 有两个端口)被用于选择波特率和奇偶校验。 只有 在 s 7 — 2 0 0 位 于 RU N( 运 行 )模 式 时才 能使 用 自由端 口通讯 . 在 S M B 3 0( 端口0)或 S NB 1 3 0( 端口 1 )的协议选择域中设置一个 O l 数值, 启 用 自由端 口模式 . 位于 自由端 口模 式 时 ,无法 与 编程设 备通讯 。当 s 7 — 2 0 0 位于 S T O P( 停止 ) 模式时 ,自由端口模式被禁用 ,正常通讯重新建立 ( 例 如 ,编 程设 备存取 ) 。 ( 1 )传输数 据 通过 “ 传输”指令 ( X M T) 可 以传送一个或多个字符 ,最多可达 2 5 5 个字符。如果在传输完成事件 中附加一个中断例行程序 , 在缓冲器的最后一 个字符传送后,s 7 — 2 0 0会生成一个中断 ( 端口0为中断事件 9 , 端口 1 为中 断事件 2 6) 。 ( 2) 接 收数 据

PLC技术下的机床电气控制自动化系统设计

PLC技术下的机床电气控制自动化系统设计作者:李东旭来源:《中国新通信》2022年第15期摘要:PLC技术是机床电气控制系统改造主要技术,具有控制稳定、运行可靠的优良特点。

文章在分析基于PLC的机床电气控制原理的基础上,从PLC选型、硬件设计、软件设计几个方面,论述了PLC技术在机床电气控制自动化系统设计中的应用方案,并对基于PLC技术的机床电气控制自动化系统功能调试进行了进一步分析,希望为机床电气控制自动化系统设计提供一些借鉴。

关键词:PLC技术;机床;电气控制;自动化一、引言机床是汽车、造纸、机械行业生产主要用工具,具有次品率低、效率高、适应力强的特点。

但是,在机床应用时间不断延长的背景下,电气故障频出,维修难度较大,影响了正常生产活动的开展。

而利用PLC技术设计机床电气控制自动化系统,可以发挥PLC脉冲输出能力、浮点运算能力,降低电气控制故障率,为数控生产控制提供依据。

因此,探究PLC技术在机床电气控制自动化系统设计中的应用具有非常突出的现实意义。

二、基于PLC的机床电气控制原理机床电气控制本质上是对机床加工对象位置、加工速度与加速度进行精密控制的过程,包括单坐标控制、多坐标控制两种,部分情况下也可以为多目标协调运动。

其中类似设备启动/关停的单坐标控制可以利用开关量进行控制;而多坐标控制或多目标协调运动需要借助脉冲量控制,PLC脉冲量处理功能较为突出,包括高电平、低电平两个状态,确保机床加工控制的经济性与有效性。

在脉冲量控制时,需要先将物理量向电量转换,再经电压物理量转换为频率脉冲量。

根据机床电气控制目的的差异,PLC控制可划分为轨迹控制、位置控制、转矩控制、模拟量控制、同步控制、速度控制几种类型,其中位置控制在机床电气控制中较为常见,特指控制机床加工对象或加工工具位置移动,确保加工对象在指定的位置。

由机床运动形式与动作规律可知,机床电气控制包括主电路、控制电路几个部分。

主电路中,电动机与速度继电器串电阻瞬时冲动,可经主轴进行速度控制;控制电路则经正转控制接触器接通电源,自行锁定电机串电阻启动并接通时间继电器,则在时间限制内促使电机全速正转。

如何理解plc执行程序的顺序?plc程序顺序从上往下的吗?

如何理解plc执⾏程序的顺序?plc程序顺序从上往下的吗?(1)触点的结果与步即使在动作相同的程控电路中,借助于触点的构成⽅法出可简化程序与节省程序步数。

①宜将串联电路多的电路写在上⽅。

如图1的a图。

②宜将并联多的电路写在左⽅。

如图1的b图。

(2)程序的执⾏顺序对顺控程序作“⾃上⽽下”,“⾃左向右”处理。

当PLC投⼊运⾏后,其⼯作过程⼀般分为三个阶段,即输⼊采样、⽤户程序执⾏和输出刷新三个阶段(即:输⼊、执⾏、输出)。

完成上述三个阶段称作⼀个扫描周期。

在整个运⾏期间,PLC的CPU以⼀定的扫描速度重复执⾏上述三个阶段。

(⼀) 输⼊采样阶段在输⼊采样阶段,PLC以扫描⽅式依次地读⼊所有输⼊状态和数据,并将它们存⼊I/O映象区中的相应得单元内。

输⼊采样结束后,转⼊⽤户程序执⾏和输出刷新阶段。

在这两个阶段中,即使输⼊状态和数据发⽣变化,I/O映象区中的相应单元的状态和数据也不会改变。

因此,如果输⼊是脉冲信号,则该脉冲信号的宽度必须⼤于⼀个扫描周期,才能保证在任何情况下,该输⼊均能被读⼊。

(⼆) ⽤户程序执⾏阶段在执⾏阶段,PLC总是按由上⽽下的顺序依次地扫描⽤户程序(梯形图)。

在扫描每⼀条梯形图时,⼜总是先扫描梯形图左边的由各触点构成的控制线路,并按先左后右、先上后下的顺序对由触点构成的控制线路进⾏逻辑运算,然后根据逻辑运算的结果,刷新该逻辑线圈在系统RAM存储区中对应位的状态;或者刷新该输出线圈在I/O映象区中对应位的状态;或者确定是否要执⾏该梯形图所规定的特殊功能指令。

(三) 输出刷新阶段当扫描⽤户程序结束后,PLC就进⼊输出刷新阶段。

在此期间,CPU按照I/O映象区内对应的状态和数据刷新所有的输出锁存电路,再经输出电路驱动相应的外设。

这时,才是PLC的真正输出。

好⽂推荐⼗七张图讲解⾼压开关柜安装流程及注意事项,太专业了!30岁以后,电⼯怎样做才能更有前途,这些⽅法交给你!。

汇川plc高低字节转换

汇川plc高低字节转换
PLC的寄存器分为单字(Word)和双字(Dword),Word占用2个字节Byte,Dword占用4个字节Byte;
在PLC和其他设备通讯往往以字节为单位进行传送的,根据不同的通讯协议,传送所发的内容不一致,其中有些协议需要进行前后字节交换,向常见的PLC,三菱,汇川等日系PLC有专门的指令SWAP来进行转换;例如寄存器A:=16#AABB,经过SWAP指令后,A=16#BBAA Codesys编程和传统的PLC编程不一样,Codesys编程是属于一种面向对象的编程方式,使用起来比较具有灵活性,可以根据自己的编程习惯风格来进行编程程序;下面举例如何使用Codesys来进行编写SWAP指令;
代码如下:
PROGRAM PLC_PRG//程序名字
IN:WORD;//IN是变量名称,WORD是变量变量类型
OUT:WORD;END_VAR
16位数据除以256,即将16位数据的高低8位自动分开。

例如原数值是;2#1111111100000000,转换成10进制就是65280,转换出16进制就是FF00.
将该数值除以256和取余256,结果分别是数值的高8位(整数),和数值的低8位(余数)
再将余数乘以256+整数得出的新数据就是高低字节转换后的数值。

leetcode 编程题大小端的转换及实现

文章标题:深度解析leetcode编程题:大小端的转换及实现一、引言在计算机科学领域,大小端的概念是非常重要的。

无论是在数据存储还是在网络通信中,了解大小端的转换及实现都是至关重要的。

在本文中,我们将深入探讨leetcode编程题中关于大小端的转换及实现,帮助读者全面理解这一概念。

二、大小端的概念1. 什么是大小端在计算机中,数据的存储是以字节为单位的,而字节是由8位二进制数组成的。

在大部分计算机系统中,数据的存储顺序可以分为两种:大端序(Big Endian)和小端序(Little Endian)。

在大端序中,数据的高字节存储在低位置区域,而在小端序中,数据的低字节存储在低位置区域。

2. 为什么要了解大小端了解大小端的转换及实现对于不同系统之间的数据交换非常重要。

在网络通信中,如果两台计算机的大小端序不一致,就需要进行大小端的转换。

在数据存储和处理中,也需要考虑不同系统之间的大小端问题。

三、leetcode编程题中的大小端实现在leetcode编程题中,经常会遇到需要处理大小端的情况。

下面我们将讨论一些leetcode编程题中常见的关于大小端的转换及实现。

1. 两数之和在leetcode的两数之和问题中,我们需要在给定的整数数组中找到两个数,使它们的和等于一个特定的目标值。

对于这个问题,我们需要考虑不同系统之间的大小端问题。

在处理数组时,需要根据不同系统的大小端序来进行数据的存储和处理。

2. 反转链表反转链表是leetcode中一个经典的问题,需要将一个单链表反转。

在解决这个问题时,我们需要考虑不同系统之间的大小端问题。

在处理链表节点时,需要根据不同系统的大小端序来进行节点指针的存储和处理。

四、大小端转换的实现方式了解了leetcode编程题中关于大小端的问题后,接下来我们将讨论大小端的转换及实现方式。

1. 通过位运算实现大小端转换位运算是处理大小端转换的常见方式之一。

通过位运算,可以针对不同系统的大小端序进行数据的存储和处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PLC程序移植中的字节顺序问题探讨
作者:孙启法,周升波
来源:《现代职业教育·中职中专》2017年第07期
[摘要] 不同的PLC系统对多字节变量的存储有大端顺序与小端顺序两种字节顺序,在不同字节顺序的PLC系统间移植程序必须注意这一问题,需要针对性地做出改变才能保证移植的正确性。

旨在通过案例来探讨正确处理多字节变量的程序在移植时的方法。

[关键词] PLC程序移植;字节顺序;大端顺序;小端顺序
[中图分类号] G712 [文献标志码] A [文章编号] 2096-0603(2017)20-0054-02
一、引言
PLC是一种专门为在工业环境下应用而设计的数字运算操作的电子装置,实质上是一种专门用于工业控制的计算机,其硬件结构基本上与微型计算机相同。

PLC性能稳定,能在恶劣的环境中可靠工作,是被公认为最可靠的工业控制设备之一。

自从1969年美国研制出第一台PLC,几十年来PLC发展迅速,已成为自动化控制的主流设备。

为了贯彻职业教育与产业对接,教学和生产实践对接的指导方针,目前很多中职学校的机电专业都开设了PLC课程。

但由于行业标准出现较晚,不同厂家PLC的指令集往往千差万别,且硬件结构往往也不相同,所以,从事PLC的编程或教学人员在使用不同的PLC时,都会遇到程序移植问题。

PLC程序在不同PLC间进行移植时需要考虑的问题很多,其中字节顺序就是重点考虑的问题之一。

本文就以PLC教学实训时的一个典型实例来探讨这一问题。

二、PLC程序移植案例
(一)项目简介
目前中职的PLC教学往往都是根据从生产实践中提炼出来的一些典型案例开展的,其中彩灯控制是PLC实训中的一个常见项目。

该项目通常是通过使用计时器和移位指令来实现,是一个用来训练计时器和移位指令的典型案例。

笔者在PLC教学实训时还基于这个实例开展过译码指令和计数器的综合实训,最初是在三菱的FX2N PLC上实现的,最近在一次实训中需要将这个程序移植到西门子S7-200 PLC上,就遇到了由于两个系统的字节顺序不同造成错误的情况,下面就通过这次排错来跟大家一起探讨一下PLC字节顺序的有关问题。

首先我介绍一下实训用的项目和利用译码指令、计数器指令实现的思路。

项目是n(n小于或等于PLC输出点数,本案例为说明双字节变量的移植取n等于9)只LED彩灯,要求依次点亮并循环,时间间隔为1s,使用两个按钮控制启动和结束。

编程的思路是对1s脉冲进行计数,对计数器的当前值进行译码,译码的结果输出到输出继电器。

(二)FX2N平台下的实现
先说一下在FX2N上具体的实现方法。

启动按钮和停止按钮分别连接到输入端子X0和
X1,9只彩灯分别连接到输出端子Y0到Y10。

程序中由软元件X000、Y000和M0构成典型的启动停止控制,其中M0作为运行标志。

接下来的程序中利用16位计数器C0对1s脉冲进行计数,根据LED彩灯的个数设置计数器的设定值为9,利用C0的常开触点对C0复位来实现循环点亮。

运行过程中将C0的当前值译码与结果直接输出到输出继电器。

具体程序如图1所示。

(三)移植到S7-200 PLC的过程和遇到的问题
这个程序还是很简单的,现在介绍一下将这个程序移植到西门子S7-200型PLC的过程以及所遇到的问题。

首先要对用到的指令和软元件进行移植,有些指令和软元件是可以直接替换的,上面程序中的X000和X001要分别改为I0.0和I0.1,M0要改为M0.0,M8013要改为M0.5,计数器C0 K10要改为CTU类型的C0,PV设置为10,这些软元件在两种PLC中有着简单的对应关系,可以直接替换。

而译码指令在两种PLC中的用法并不完全相同,虽然都是译码,功能都是对输入的数据n,计算2n输出结果,但是FX2N中的译码指令DECO是16位指令,能够将源地址(字软元件)的低n位或源地址(位软元件)开始的n位译码到目标地址(字地址,此时n 的最大值为4)或从目标地址(位地址,此时n的最大值为8)起的2n位;而S7-200中的译码指令DECO的功能是将输入的字节的低4位译码到输出的字地址单元,将其对应位置1。

应该注意到二者的输入不同,前者比较灵活,既可以是n位的位软元件,也可以是字软元件的低n位,而后者则相对单一,只能从字节输入,输出到字,这就导致16位的计数器的当前值并
不能直接作为译码指令的输入,必须将计数器当前值首先传送到一个字节中。

笔者在S7-200 PLC的指令集中找到了两条指令,一条是字传送指令MOV_W,另一条是整数转换为字节指令ITB,由于以前在FX2N的指令集中只有传送指令,因此最后选用了与其对应的传送指令MOV_B来实现。

经过上面的一系列处理得到了下面的PLC梯形图程序,如图2所示。

但是程序在运行时出问题了,竟然没有输出正确的结果。

错误的原因在哪里呢,通过监视运行发现,问题出在网络3,VB0的值竟然永远是0,所以导致QW0一直是1,也永远只有
Q1.0是1,即只有第9个彩灯是亮的。

怎么会这样呢,继续往前查,发现VW0的值在运行过程中是正常从0到9变化的,而将VB0中的数值译码后就不对了,这说明问题就出在VB0上。

另外,为什么QW0是1的时候,是Q1.0为1,而不是Q0.0呢?
(四)对移植时出现的错误分析
VB0永远是0是什么原因造成的呢?为什么QW0是1的时候Q1.0为1呢?这两个问题都要用长度为字的数据在系统中存储时的字节顺序来解释了。

什么是字节顺序呢?字节顺序是指占内存多于一个字节的数据类型中的各个字节在内存中的存放顺序,如1个字包含2个字节,字中的字节顺序有两种,一种格式是高位字节存储在低地址,低位字节存储在高地址,这被称为大端顺序;而另一种则正好相反,低位字节存储在低地址,高位字节存储在高地址,这种顺序称为小端顺序。

因为不同的机器类型可能采用不同的字节顺序,所以在不同系统间移植程序时,对多字节数据类型必须弄清楚系统的字节顺序。

上面的程序之所以在FX2N上能正确运行,而在S7-200系统上就不能运行,其原因就是这两个系统采取了不同的字节顺序,FX2N采用的字节顺序是小端顺序,而S7-200则采用了大端顺序,VB0永远是0和QW0是1的时候Q1.0为1这两个问题都是由于这个原因造成的。

(五)正确的移植方法和程序
在图1所示的FX2N程序中,用到的多字节软元件有C0和K4Y000都是16位的,即双字节的字元件,其储存格式采用小端顺序,其中C0在程序中的取值范围是0到9,译码指令将C0的低4位译码并将结果输出到K4Y000。

这两个字元件在S7-200中对应的变量分别是C0和QW0,他们也是双字节的,采用的是大端顺序,译码指令根据输入的字节变量的低4位所表示的位号,将输出字QW0的相应位置为1。

这里有两点需要注意,一是两个系统的译码指令接受的输入类型不同,FX2N中的译码指DECO可以直接使用字元件,但是S7-200中的译码指令DECO只能接受字节变量;二是S7-200采用大端顺序,需要译码的数据0到9存在C0的高位字节,而0到7译码的结果储存在QW0的高位字节,8和9的译码结果则存在QW0的低位字节。

第一个问题在前面已经解决了,所以现在只需要解决第二个问题:将QW0的高位字节和低位字节交换。

一种方法是译码指令不直接输出到QW0,而是输出到一个方便分别存取高低位字节的中间变量,然后将其低位字节传送到QW0的高位字节QB0,低位字节传送到QW0的低位字节QB1;另一种方法是利用S7-200的字节交换指令SWAP,直接将QW0的高低位字节交换。

显然第二种方法更为简洁一些,但是需要对指令集要比较熟悉,第一种方法则适合对指令集不熟悉或对输出端口有特别要求的情形。

在此,笔者采用了第二种方法对程序进行了改写。

最后得到的移植后的程序如图3所示。

三、结束语
在不同的PLC系统间移植程序是比较复杂的问题,要想正确移植程序,除了要弄清不同PLC系统的指令和变量(软元件)的对应关系及不同之处以外,还必须弄清要移植的程序中用到了哪些多字节的变量,它们在程序中是如何使用的,以及原平台和目标平台字节顺序分别是
哪种,然后根据字节顺序对多字节变量进行必要的转换。

只有这样才能避免由于字节顺序不同造成的错误。

这个例子也提示我们在PLC的编程过程中既要注意指令的学习,还应该重视PLC系统底层的实现。

相关文档
最新文档