通讯函数 1. DELAY 语法 DELAY(time) 让宏指令暂停执行,持续的时间至少是指定的这个时间。时间的单位为毫秒。 time可以是常数或者变量。 例如: macro_commandmain() int time= 500 DELAY(100) // delay 100 ms DELAY(time) // delay 500 ms endmacro_command 2. ADDSUM 语法 ADDSUM(source[start], result, data_count) 将 source[start] 到 source[start+data-count-1] 的所有一维数组的数据累加起 来,以获得 checksum (校验和),并将结果存放在 result 变量中。 result 必须为变量,data_count 是进行累加的资料的个数,可以是常数或者是变量 例如: macro_commandmain() chardata[5] shortchecksum data[0]= 0x1 data[1]= 0x2 data[2]= 0x3 data[3]= 0x4 data[4]= 0x5 ADDSUM(data[0],checksum, 5) // checksum is 0xf endmacro_command 3. XORSUM 语法 XORSUM(source[start], result, data_count) 将 source[start] 到 source[start+data-count-1] 的所有一维数组的数据进行异 或运算,以获得 checksum (校验和),并将结果存放在 result 变量中。 result 必须为变量,data_count是进行异或计算的数据的个数,可以是常数或者是 变量。 例如: macro_commandmain() chardata[5] = {0x1, 0x2, 0x3, 0x4, 0x5} shortchecksum XORSUM(data[0],checksum, 5) // checksum is 0x1 endmacro_command 4. CRC 语法 CRC(source[start], result, data_count) 将 source[start] 到 source[start+data-count-1] 的所有一维数组的数据进 16-bitCRC 计算,以获得checksum (校验和),并将结果存放在 result变量中。 result 必须为变量,data_count是进行计算的资料的个数,可以是常数或者是变量。 例如: macro_commandmain() chardata[] = {0x1, 0x2, 0x3, 0x4, 0x5} short16bit_CRC CRC(data[0],16bit_CRC, 5) // 16bit_CRC is 0xbb2a endmacro_command 5. OUTPORT 语法 OUTPORT(source[start], device_函数名称,data_count) 将放置在从 source[start] 到 source[start+count-1] 的所有数据通过串行端口或 者以太网口传送给 PLC 或者控制器中。 device_ 函数名称是在 ‚ 设备列表‛ 中定义的 ‚ LC 名称,而这个 device 必须选择为 ‚Free Protocol这个 PLC 类型。 Data_count是发送数据的个数,可以是常数或变量。
威纶通触摸屏宏指令通讯函数图1
要使用 OUTPORT 函数,必须要在 PLC 类型中选择 ‚Free Protocol,如上图所 示。这里的 device_函数名称即为 ‚MODBUD RTUDevice‛。端口的属性也是依据在 这个 ‚系统参数 中的设定,譬如,在此设定为 (9600,E,8,1…) 下面是一个范例程序,使用自由协议,以MODBUS RTU 的协议格式,将单个寄存 器设置为 ON。 macro_commandmain() charcommand[32] shortaddress, checksum FILL(command[0],0, 32) // 初始化命令 Command[0]= 0x1 // 站号 Command[1]= 0x5 // 功能码 : 写单个位 address= 0 HIBYTE(address,command[2]) LOBYTE(address,command[3]) Command[4]= 0xff // 使该bit设置为ON Command[5]= 0 CRC(command[0],checksum, 6) LOBYTE(checksum,command[6]) HIBYTE(checksum,command[7]) // 将命令通过串行埠送出去 OUTPORT(command[0],"MODBUS RTU Device", 8) endmacro_command 1. INPORT 语法 INPORT(read_data[start], device_函数名称, read_count,return_value) 从串行端口或者以太网口读数据到触摸屏界面上。这些资料保存在 read-data[start]~read-data[start+read_count-1] 这个一维数组中。同样的, device_函数名称见上面的说明,在此不再详述。 read-count是设定的需要读取的命令的位组长度,它可以是一个常数或变量。如果 这个函数能够成功的从 PLC 或者控制器中读取到数据,则return_value的值为实际接收个数, 否则就为 0。 下面是一个使用 INPORT 函数读取一个 MODBUS 设备保持寄存器数据的范例。 // 读取保持寄存器数据 macro_commandmain() charcommand[32], response[32] shortaddress, checksum shortread_no, return_value, read_data[2] FILL(command[0],0, 32) // 命令初始化 FILL(response[0],0, 32) Command[0]= 0x1 // 站号 Command[1]= 0x3 // 功能码:读取保持寄存器 address= 0 HIBYTE(address,command[2]) LOBYTE(address,command[3]) read_no= 2 // read 2 words (4x_1 and 4x_2) HIBYTE(read_no,command[4]) LOBYTE(read_no,command[5]) CRC(command[0],checksum, 6) LOBYTE(checksum,command[6]) HIBYTE(checksum,command[7]) // 使用 OUTPORT 函数将命令送出去 OUTPORT(command[0],"MODBUS RTU Device", 8) // 使用 INPORT 函数读取返回的命令 INPORT(response[0],"MODBUS RTU Device", 9, return_value) ifreturn_value > 0 then read_data[0]= response[4] + (response[3] << 8) // data in 4x_1 read_data[1]= response[6] + (response[5] << 8) // data in 4x_2 SetData(read_data[0],"Local HMI", LW, 100, 2) endif endmacro_command 2. INPORT2 语法 INPORT2(response[start], device_name,receive_len, wait_time) 从串行端口或者以太网口读数据到触摸屏界面上。这些数据保存在 response 这个一 维数组中。device_name 的说明与 OUTPORT 相同,在此不再详述。 receive_len存放所接收到的数据位组长度,必须为变量。receive_len 的最大长度 将不会超过 response 数组宣告的大小。wait_time 表示等待时间 (单位是 millisecond),可以是一个常数或变量。当数据读取完毕后,若在指定的等待时间内 未再收到任何数据,此函数便结束执行并回传结果 例如: macro_commandmain() shortwResponse[6], receive_len, wait_time=20 INPORT2(wResponse[0],"Free Protocol", receive_len, wait_time) //wait_time 单位 : millisecond ifreceive_len > 0 then SetData(wResponse[0],"Local HMI", LW, 0, 6) // 把响应的数据写入LW0 end if endmacro_command 3. GetData 语法:GetData(read_data[start],device_ 函数名称 , device_type, address_offset, data_count) 或者 GetData(read_data,device_函数名称, device_type, address_offset, 1) 获取 PLC 的资料。数据是存储在 read_data[start]~read_data[start+data_count-1]这些一维数组变量中。 data_count是设定的读取数据的个数。一般来说,read_data 是一个一维数组,但 是如果 data_count 是 1,read_data 可以是一个一维数组,也可以是一个普通的 变量。下面是两种从 PLC 中读取一个字的方法。 macro_commandmain() short read_data_1[2], read_data_2 GetData(read_data_1[0], “FATEK FB Series”,RT, 5, 1) GetData(read_data_2, ‚”FATEK FB Series”, RT, 5, 1) endmacro_command 此处的 device_函数名称,即为在 ‚系统参数中建立 PLC 类型时,设定的PLC
名称。在此,PLC 名称被设定为 ‚FATEKFB Series,如下图所示。
威纶通触摸屏宏指令通讯函数图2
device_type是设备类型和 PLC 中数据的编码方式。例如:如果 device_type 是 LW_BIN,那么读取的设备类型为 LW,数据编码方式为 BIN。如果使用 BIN 编码方 式,‚_BIN‛ 可以忽略。 如果 device_type 是 LW_BCD,表示设备类型 LW, 数据的编码方式为 BCD 格式。 address_offset 是 PLC 中的地址偏移量。 例如,GetData(read_data_1[0],“FATEK FB Series”, RT, 5, 1) 代表读取的设备地址 偏移量为 5。 如果 address_offset 使用格式为 “N#AAAAA”,N 表示 PLC 的站号,AAAAA 表 示地址偏移量。此情况一般使用在同一个串口上连接有多台 PLC 或者控制器的 情况下。例如:GetData(read_data_1[0],“FATEK FB Series”, RT, 2#5, 1) 表示读取 站号为 2 的 PLC 的数据。如果 GetData() 使用 ‚系统参数 / 设备列表中设
定的默认的站号,在此可以不填这个站号
威纶通触摸屏宏指令通讯函数图3
从 PLC 中读取的资料个数,根据 read_data 变量的类型和 data_count 的值来决 定的。如下所示: read_data的类型 data_count的值 读取16位数据的个数 char(8-bit) 1 1 char(8-bit) 2 1 bool(8-bit) 1 1 bool(8-bit) 2 1 short(16-bit) 1 1 short(16-bit) 2 2 int(32-bit) 1 2 int(32-bit) 2 4 float(32-bit) 1 2 float(32-bit) 2 4 当 Getdata() 函数读取 32 位的数据类型 (int 或者float型) 时,此函数会自动的转 换这个数据。如: macro_commandmain() float f GetData(f, "MODBUS", 6x, 2, 1) // f 中将会是浮点型的数据 endmacro_command 举例: macro_commandmain() bool a boolb[30] short c shortd[50] int e intf[10] doubleg[10] // 读取 LB2 的状态到变量 a 中 GetData(a,“Local HMI”, LB, 2, 1) // 读取 LB0~LB29共 30 个状态,到变量 b[0] ~ b[29] 中 GetData(b[0],“Local HMI”, LB, 0, 30) // 读取 LW-2 的数据到变量 c 中 GetData(c,“Local HMI”, LW, 2, 1) // 读取 LW-0 ~ LW-49 共 50 个字到变数 d[0] 到 d[49] 中 GetData(d[0],“Local HMI”, LW, 0, 50) // 读取两个字 LW-6 ~ LW-7 到变数 e 中 // 注意此时变量 e 的类型为 int GetData(e,“Local HMI”, LW, 6, 1) // 读取 LW-0 ~ LW-19 共 20 个字到变数 f[0] ~ f[9] 中 (共 10 个 int 型变量), 数组 f[10] 的变量类型定义为 int。 // 注意一个 int 资料将占据 2 个字符 GetData(f[0],“Local HMI”, LW, 0, 10) // 读取 LW-2 ~ LW-3 共 2 个字到变数 f 中 GetData(f,‚Local HMI‛, LW, 2, 1) endmacro_command 1. GetDataEx 语法 GetDataEx (read_data[start], device_函数名称,device_type, address_offset, data_count) 或者 GetDataEx(read_data, device_函数名称, device_type, address_offset, 1) 获取 PLC 的数据,不等待 PLC 响应,径自往下执行。 read_data、device_函数名称、device_type、address_offset 和 data_count的说明和 GetData 相同。 例如: macro_commandmain() bool a boolb[30] short c shortd[50] int e intf[10] doubleg[10] // 读取 LB-2 的状态到变量 a 中 GetDataEx(a, ‚Local HMI‛, LB, 2, 1) // 读取 LB-0 ~ LB-29 共 30 个状态,到变量 b[0] ~ b[29] 中 GetDataEx(b[0], ‚Local HMI‛, LB, 0, 30) // 读取 LW-2 的数据到变量 c 中 GetDataEx(c, ‚Local HMI‛, LW, 2, 1) // 读取 LW-0 ~ LW-49 共 50 个字到变数 d[0] 到 d[49 ]中 GetDataEx(d[0], ‚Local HMI‛, LW, 0, 50) // 读取两个字 LW-6 ~ LW-7 到变数 e 中 // 注意此时变量 e 的类型为 int GetDataEx(e, ‚Local HMI‛, LW, 6, 1) // 读取 LW-0 ~ LW-19 共 20 个字到变数 f[0] ~ f[9] 中,数组 f[10] 的变量类型定 义为 int。 // 注意一个 int 资料将占据 2 个字符 GetDataEx(f[0], ‚Local HMI‛, LW, 0, 10) // 读取 LW-2 ~ LW-3 共 2 个字到变数 f 中 GetDataEx(f, ‚Local HMI‛, LW, 2, 1) endmacro_command 2. SetData 语法 SetData(send_data[start], device_ 函数名称 ,device_type, address_offset, data_count) 或者 SetData(send_data,device_函数名称, device_type, address_offset, 1) 将数据写到 PLC 中。资料保存在 send_data[start]~send_data[start+data_count-1]中。 data_count是写入到 PLC 中资料的个数。一般来说,send_data是一个数组。但 是如果 data_count 是 1,send_data 可以是一个数组也可以是一个普通的变量。 下面是写一个数据到 PLC 中的方法。 macro_commandmain() short send_data_1[2] = { 5, 6}, send_data_2 =5 SetData(send_data_1[0], “FATEK FB Series”,RT, 5, 1) SetData(send_data_2, “FATEK FB Series”, RT, 5, 1) endmacro_command device_函数名称详见上面的说明,在此不在说明。 device_type是设备类型和 PLC 中数据的编码方式。例如:如果 device_type 是 LW_BIN,那么读取的设备类型为 LW,数据编码方式为 BIN。如果使用 BIN 编码方 式,“_BIN” 可以忽略。 如果 device_type 是 LW_BCD,表示设备类型 LW,数据的编码方式为 BCD格式 address_offset是 PLC 中的地址偏移量。 例如,SetData(read_data_1[0], “FATEK FB Series”, RT, 5, 1) 代表读取的设备地 址偏移量为 5。 如果 address_offset 使用格式为 “N#AAAAA”,N 表示 PLC 的站号,AAAAA 表 示地址偏移量。此情况一般使用在同一个串行埠上连接有多台 PLC 或者控制器的情 况下。例如:SetData(send_data_1[0],“FATEK FB Series”, RT, 2#5, 1) 表示设定 站号为 2 的 PLC 的数据。如果 SetData()使用 “系统参数 / 设备列表” 中设定的默认的站号,在此可以不填这个站号。 设定到 PLC 的数据个数,根据 sead_data 变量的类型和 data_count 的值来决定 的。如下所示: sead_data的类型 data_count 的值 设定16 位数据的个数 char(8-bit) 1 1 char(8-bit) 2 1 bool(8-bit) 1 1 bool(8-bit) 2 1 short(16-bit) 1 1 short(16-bit) 2 2 int(32-bit) 1 2 int(32-bit) 2 4 float(32-bit) 1 2 float(32-bit) 2 4 当 Setdata() 函数写入 32 位的数据类型 (int 或者 float型) 到 PLC 时,此函数会 自动的转换这个数据。如: macro_commandmain() float f= 2.6 SetData(f,"MODBUS", 6x, 2, 1) // 在此将会设定一个浮点数到 PLC 中 endmacro_command 举例: macro_commandmain() int i bool a =true boolb[30] short c= false shortd[50] int e =5 intf[10] for i =0 to 29 b =true next i for i =0 to 49 d = i* 2 next i for i =0 to 9 f =i * 3 next i // 变量 a 的数值设定到 LB2 中 SetData(a,‚Local HMI‛, LB, 2, 1) // 设定 LB0 ~ LB29 共 30 个位的状态 SetData(b[0],‚Local HMI‛, LB, 0, 30) // 将变量 c 的值设定到 LW-2 中 SetData(c,‚Local HMI‛, LW, 2, 1) // 设定 LW-0 ~ LW-49 共 50 个数据 SetData(d[0],‚Local HMI‛, LW, 0, 50) // 将变量 e 的值写入到 LW-6 ~ LW-7 两个寄存器中,注意变量 e 的类型为int。 SetData(e,‚Local HMI‛, LW, 6, 1) // 设定 LW-0 ~ LW-19 共 20 个字的数据 //10 个双整型数据等于 20 个 16 位整型数 (1个字符),因一个 int 数据将占据 2 个字符 SetData(f[0],‚Local HMI‛, LW, 0, 10) endmacro_command 3. SetDataEx 语法 SetDataEx (send_data[start], device_ 函数名称 ,device_type, address_offset, data_count) 或者 SetDataEx(send_data, device_函数名称, device_type, address_offset, 1) 将数据写到 PLC 中,不等待 PLC 回应,径自往下执行。 send_data、device_函数名称、device_type、address_offset和data_count的说明和 SetData 相同。 例如: macro_commandmain() int i bool a =true boolb[30] short c= false shortd[50] int e =5 intf[10] for i =0 to 29 b =true next i for i =0 to 49 d = i* 2 next i for i =0 to 9 f =i * 3 next i // 将变量 a 的数值设定到 LB2 中 SetDataEx(a,‚Local HMI‛, LB, 2, 1) // 设定 LB0 ~ LB29 共 30 个位的状态 SetDataEx(b[0], ‚Local HMI‛, LB, 0, 30) // 将变量 c 的值设定到 LW-2 中 SetDataEx(c, ‚Local HMI‛, LW, 2, 1) // 设定 LW-0 ~ LW-49 共 50 个数据 SetDataEx(d[0], ‚Local HMI‛, LW, 0, 50) // 将变量 e 的值写入到 LW-6 ~ LW-7 两个寄存器中,注意变量 e 的类型为int。 SetDataEx(e, ‚Local HMI‛, LW, 6, 1) // 设定 LW-0 ~ LW-19 共 20 个字的数据 //10 个双整型数据等于 20 个 16 位整型数 (1个字符),因一个 int 数据将占据 2 个字符 SetDataEx(f[0], ‚Local HMI‛, LW, 0, 10) endmacro_command 4. GetError 语法 GetError(err) 取得系统执行的错误码 例如: macro_commandmain() shorterr charbyData[10] GetDataEx(byData[0],‚MODBUS RTU‛, 4x, 1, 10) // 读取 10 byte数据 // 当错误码 (err) 为 0,表示 GetDataEx 成功执行 GetErr(err) // 读取错误码,存入变量err endmacro_command 5. PURGE 语法 PURGE (com_port) com_port 表示串行端口编号,支持 COM1 ~ COM3。此参数可以为变量或常数。 可利用这个指令来清空 COM port 的输出入缓冲区。 例如: macro_commandmain() intcom_port=3 PURGE(com_port) PURGE(1) endmacro_command 6. SetRTS SetRTS(com_port,source) 拉高或拉低 RS-232 之 RTS 讯号。 com_port 表示串行端口编号,支持 COM1。此参数可以为变量或常数。source参 数也可以为变量或常数。 当传入的 source 参数值大于 0 时,将拉高 RTS 电位,当 source 参数值等于 时,将拉低 RTS 电位。 例如: macro_commandmain() charcom_port=1 charvalue=1 SetRTS(com_port,value) // value > 0,拉高 COM1 之 RTS 电位 SetRTS(1,0) // 拉低 COM1 之 RTS 电位 endmacro_command 7. GetCTS 语法 GetCTS(com_port, result) 侦测 RS-232 之 CTS 讯号。 com_port 表示串行端口编号,支持 COM1。此参数可以为变量或常数。result参 数必须为变量。 此函数可侦测 CTS 电位值,当 CTS 在高电位时,result 将写入 1,否则写入 0。 例如: macro_commandmain() charcom_port=1 charresult GetCTS(com_port,result) // 侦测 COM1 之 CTS 电位值 GetCTS(1, result) // 侦测 COM1 之 CTS 电位值
endmacro_command
|