报文长度不固定,如何控制PLC接收信息?【RS-485专业讲解】系列7
通过时间方式判断进行数据的接收的两种方式,我已经详细的向大家介绍了固定长度报文情况下PLC如何接收数据,本文我就向大家介绍一下当报文长度不固定的情况下我们该如何控制PLC接收信息。
首先我们回顾一下当协议中报文的长度不固定的情况下,我们是通过判断字符间的空闲时间的方式来判断一段报文的起始,通常是字符与字符之间空闲时间超过3.5个字符传输时间,我们就认为一段报文接收完毕,之后接收到的报文就是一段新的报文。下面我们来看看这个程序如何写。
1 、寄存器设定 SMB30 = 2#00001001=16#9图1-1
1)自由口模式。第0、1位。SM30.0=1、SM30.1=0
2)通讯速率9600bps。第2、3、4位。SM30.2=0、SM30.3=1、SM30.4=0
3)每个字符的数据位是8位。第5位。SM30.5=0
4)不选用奇偶效验。第6、7位。SM30.6=0、SM30.7=0
SMB87 = 2#10010100 =16#94
图1-2
1) 不使用中断条件作为检测信息的开始。第1位。SM87.1=0
2) 当SMW92中的定时时间超出时终止接收。第2、位。SM87.2=1
3) 定时器是内部字符定时器。第3位。SM87.3=0
4) 使用SMW90的值检测空闲状态。第4位。SM87.4=1
5) 不检测结束字符。第5位。SM87.5=0
6) 不检测起始字符。第6位。SM87.6=0
7) 允许信息接收功能。第7位。SM87.7=1
注:第0位为无效位不使用,永久为0。
SMW90 = 4
将SMW90设定成4表示报文间空闲时间大于4ms后接收的第一个字符是新信息的开始。
SMW92 = 4
由于我们设定SM87.3 = 0确定使用报文长度不固定方式,在9600bps通讯速率下1个字符(10个位)的接收需要1.04ms,3.5个字符的时间需要3.64ms,因此将SMW92设定成4表示当字符与字符之间的空闲时间超过4ms时停止接收信息(注:SMW92不支持小数),同时空闲4ms后(SMW90 = 4)接收到的第一个字符是新信息的开始。
SMB94 = 255
SMB94定义接收缓冲区大小,此处定义为最大255字节。(注:接收缓冲区是用来存放接收到的数据的区域,最大255字节,大家可以根据通讯情况自由定义。)
2、程序编写
图2-1
图2-2
以上就是报文长度不固定方式下,接收数据的程序,下面我们从电脑向PLC发送两组长度不同的报文 AA 11 22 BB 23 45 C1和AA11 22 BB 23 45 C1 54,看看效果。
图2-3
图2-4
图2-5
图2-6
由上面两次操作我们可以看到当报文长度不固定的时候电脑向PLC发送几个字符PLC就会接收几个字符。
作者:技成培训网(马乐)
版权为技成所有,未经同意盗取必究!
——END——
PLC的复杂数据类型不明白吗?看过之后一目了然
西门子PLC之复杂数据类型
复杂数据类型
复杂数据类型包括日期和实践(DATE_AND_TIME)、字符串(String)、数组(Array)、结构(Struct)和用户定义的数据类型(UDT)。
1、日期和时间
日期和时间(DATE_AND_TIME)占8个字节的BCD码,第1~6个字节分别存储年、月、日、时、分和秒,毫秒存储在整个第7个字节和第8个字节的高4位,星期存放在第8个字节的低4位,星期日代码为1,星期一 ~ 星期六的代码为2~7.例如2010年7月27日12点30分25.123秒可以表示为DT#10-07-27-12:30:25.123。
通过调用程序编辑器文件夹“\Libraries\Standard Libraries\IEC Function Block”中的IEC功能(参见下图)
调用SFC0”SET_CLK”可以设置和启动CPU时钟的时间和日期。调用SFC1”READ_CLK“可以读取CPU系统时钟当前的日期和时间。
2、字符串
字符串(String)是字符(Char)组成的一堆数组,每个字节存放一个字符。第1字节是字符串的最大字符长度,第2个字节是字符串当前有效字符的个数,字符从第3个字节开始存放,一个字符串最多有254字符。字符串的默认长度为254B,如下图所示,在DB3中定义字符串Fault的长度为20个字符,它只占用从DB3.DBB20开始的22B,其初始值只有4个字符“over”。String变量中未使用的字节地址被初始化为B#16#00.
可以使用标准库的IEC苦衷的21个功能来处理字符串变量,见下表,包括字符串与其他数据类型的转换、字符串比较和字符串编辑,具体方法参见在线帮助。
3、数组
数组(ARRAY)是同一类型的数据组合而成的一个单元,数组的维数最多为6维。下图给出一个二维数组ARRAY [1..2,1..3]的内部结构,它共有6个字节的元素,图中每一个小格为二进制的1位,每个元素占一行(一个字节)。ARRAY后面的方括号的数字用来定义每一维的起始元素和结束元素在该维中的编号,可以取-32768~32767之间的整数。每维之间的数字用逗号隔开,每一堆开始和结束的编号用两个小数点隔开。如果有一维有N个元素,该维的起始元素和结束元素的编号可以采用1和N,例如ARRAY [1..100]
4、结构
结构(STRUCT)可以是不同类型的数据组合,可以用基本数据类型、负载数据类型(包括数组和结构),和用户定义数据类型(UDT)做为结构的元素,例如一个结构可以由数组和结构组成,结构可以潜逃8层。用户可以把过程控制中有关数据统一组织在一个结构中,作为一个数据单元来使用,而不是使用大量单个的元素,为统一处理不同类型的数据和参数提供了方便。
5、用户定义数据类型
用户定义数据类型(User-Defined Data Types)简称UDT,是一种特殊的数据结构,用户只需要对它定义一次,定义好了可以在用户程序中作为数据类型使用,可以用它来产生大量的具有相同数据结构的数据块,用这些数据来输入用于不同目的的实际数据。例如生成用于颜料混合配方的UDT后,可以用它来生成用于不同颜色配方的数据组合。用户定义数据类型有基本数据类型和复杂数据类型组成。定义好以后可以在符号表中为它指定一个符号名,使用UDT可以节约录入数据的时间。
举例说明:
1、数组的生成和使用
(1)生成数组
可以在数据块中定义数组,也可以在逻辑块的变量声明表中定义它。下面介绍在数据块中定义的方法,在SIMATIC管理器中用菜单命令:【插入】-【S7块】-【数据块】生成数据块DB3,双击打开DB3,默认显示方式为声明视图方式如下图所示:声明视图用于定义、删除和修改共享数据块中的变量,指定它们的名称、数据类型和初始值。第一行和最后一行标有STRUCT和EDN_STRUCT,这两行中间有一个自动生成的临时占位符变量。
按如下图输入
在类型INT所在行的地址列自动生成*2.0,表示一个数组占用2B,地址列+12表示该数组的6个元素一共占用12B,地址列的内容自动生成,可以给每个变量加上注释,数组第一个元素维press[1,1],第6个元素为press[2,3],
(2)给数组元素赋初始值
Step7根据变量的数据类型给出默认的初始值,用户可以修改初始值,定义数组时可以在ARRAY所在的行的初始值中给元素赋初始值,如上图所示。执行菜单命令【视图】-【数据视图】,切换到数据视图方式,将显示数组和结构中个元素的初始值和实际值如下图所示
(3)访问数组中的数据
例如:”TANK” .press[2,1]。其中TANK是数据块DB3的符号名,press是数组名称,它们用英语的句号分开。方括号中的是数组元素的下表,该元素是数组的第4个元素如下图。
(4)用数组传递参数,如果在块的变量声明表中声明形参的类型为ARRAY,可以将整个数组作为参数来传递,在调用块时可以将每个数组元素赋值给统一数据类型的参数,如下图。
(5)用数组定义数据块的大小
数据块的大小与数据块中定义的变量的个数和数据类型有关,如果需要一个容量很大的数据块,可以用数组来定义数据块的大小,如果在数据块中只定义一个数组ARRAR[1..500],数组元素的数据类型为字,则该数据块的大小为100B。可以用绝对地址和任意的简单数据了诶行来方位该数据块中的存储单元。若方位数据块中未定义的地址,将会出现错误信息“读取时发生区域长度错误”。
(6)设置数据块参数:鼠标右键点击数据块,选择对象属性,出现如下图所示,具体如何设置参见帮助。
(7)使用程序状态功能监视数据块
点击数据块工具栏上的监视按钮,自动切换到“数据视图”显示方式,数据块内的存储单元在线的数值在实际值列中显示,程序状态被激活后,不能切换“声明视图”方式。
2、结构的生成和使用
(1)结构的生成
可以在数据块中或逻辑块的声明表中定义结构,下面介绍在数据块中定义的方法,在上面DB3数据块中,再定义一个结构,名为stack的结构由3个不同数据类型的变量组成。如下图所示:
在“ARRAY”下面的INT,按回车键,在该单元下面生成一个空白行,在名称输入stack,在类型列单元点右键选择复杂数据类型,选择STRUCT,(也可以直接输入STRUCT),按回车后再改行下面出现新的行,按如图输入。在END_STRUCT点回车,在出现的新的行中定义一个名为fault的字符串,如上图所示,字符串长度占20个字符
在上图中stack所在行的地址列中的+12表示结构在数据块中的起始地址为DBB12,结构中各元素的地址列中的+2.0等表示在结构中的相对起始地址,=8.0表示该结构一共占用8B,最后一行地址行的=42.0表示DB块中的数组、结构和字符串一共占用42B,
(2)访问结构中的元素
可以用结构中的元素的绝对地址或符号地址来访问结构中的元素,访问结构中的数据时,需要指出结构所在的数据块的名称、结构名称,以及结构元素名称,数据块tank内结构stack的元素amount应表示为”tank”.stack.amount。因为amount从数据块tank(DB3)的第12号字节开始存放,它的绝对地址为DB3.DBW12.
(3)用结构传递参数
如果在块的变量声明表中,声明形参的类型为数组或结构,可以将整个数组或结构而不是它们的每个元素作为参数来传递,调用块时也可以将某个数组或结构的元素赋值给同一类型的参数。
将复杂数据类型的变量作为参数传递时,作为形参和实参的两个变量必须具有相同的数据结构,例如两个结构应具有相同数据类型的结构元素和相同的排列顺序。
3、用户定义数据类型的生成和使用
在SIMATIC管理器的左面窗口”块“,执行菜单命令【插入】-【S7块】-【数据类型】,生成新的UDT,在生成UDT的元素时,可以设置它的初始值和加上注释,如下图
从表面上看UDT1与stack完全相同,但是它们有本质区别。
结构(STRUCT)是在数据块声明视图方式或逻辑块的变量声明表中与别的变量一起定义的,但是UDT必须在特殊的数据块内单独定义,并单独存放在一个数据块中。生成UDT后,在定义变量时将它作为一个数据类型来多次使用,例如:在变量声明表中定义一个变量,其数据类型为UDT1,名称为ProData如下图
上图可以看出,UDT在数据块中的使用方法与其他数据类型(如INT)是一样的。
UDT可以在逻辑块(FC、FB、OB)的变量生命表中作为基本数据类型或复杂数据类型来使用,或者在数据块(DB)作为变量的数据类型来使用。
相关问答
三菱PLC高速计数器的脉冲怎么换算成长度?
用高速计数器的话,如转的较快,你可以每秒钟把高速计数器的值传给一个寄存器,用这个值乘以60秒,再除以编码器一圈的脉冲数即可得到转速,同时复位高速计数器进...
plc一个扫描周期一般小于多少毫秒?
一般小于10毫秒。因为PLC的实时性要求比较高,扫描周期越短,控制系统响应的速度就越快。而且在每个扫描周期内,PLC需要完成大量的控制逻辑和数据传输等任务,时...
请教编程时候PLC扫描周期该怎么理解?
这个问题看书上的解释就是最权威的解释了,如果不太理解就多读几遍!其实,在编程的时候,一般是不会特意去在意这个扫描周期的,当然有的程序的确会超出扫描周...可...
在PLC里的扫描周期?
扫描周期是plc的一个重要指标,小型plc的扫描周期一般为十几毫秒到几十毫秒。plc的扫描周期长短取决于扫描速度和用户程序的长短。毫秒级的扫描时间对于一般工...
三菱plc通信报文怎么写?
三菱PLC通信报文需要按照指定的格式进行编写,一般情况下是根据三菱手册中的说明文档进行编写的。具体来说,需要按照以下步骤进行:1.确定通信协议类型和通信...
plc的run模式,扫描周期有哪五个阶段?
plc(可编程逻辑控制器)的运行模式通常包括扫描周期的五个阶段。以下是每个阶段的详细介绍:1.输入扫描阶段:在这个阶段,plc会读取外部输入信号,例如传感器...
在西门子PLC编程中,什么时候用字节,什么时候用字,什么时候用双字?难道就不能用一种,如字节?
按照数据长度选用。8位数据用字节,比如IB0(包括I0.0~I0.7共8个位).16位数据用字,比如IW0(包括IB0、IB1共16位)32位数据用双字,比如MD100(包括MW100、MW10...
plc传输设置怎么设置?
1.PLC传输设置需要根据具体情况进行设置。2.PLC传输设置需要考虑传输速率、数据长度、校验方式等因素,具体设置需要根据传输的数据类型和传输距离等因素进行...
plc排队程序怎么写?
PLC排队程序的编写需要依据具体的实际应用需求,以下提供一个简单的示例:1.定义变量:定义一个整型数组Queue,用于存储排队顾客的编号,定义一个整型变量Count...
维控PLC小的尺寸是多少?知道的请回答
[回答]维控PLC在不接任何设备和线的情况下,把步进电机的每根线分开,不要碰线,用手转动转轴,好电机,应该是只需要一定的力,就可以顺利的转动,中间无卡的现...