QQ登录

只需一步,快速开始

威纶通触摸屏宏指令通讯函数

[ 复制链接 ]
通讯函数
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_函数名称是在 ‚设备列表‛ 中定义的 &#8218LC 名称,而这个  device 必须
选择为 ‚Free Protocol这个  PLC 类型。
Data_count是发送数据的个数,可以是常数或变量。

威纶通触摸屏宏指令通讯函数图1

威纶通触摸屏宏指令通讯函数图1
要使用 OUTPORT 函数,必须要在  PLC 类型中选择 ‚Free Protocol,如上图所
示。这里的  device_函数名称即为 ‚MODBUD RTUDevice‛。端口的属性也是依据在
这个 ‚系统参数 中的设定,譬如,在此设定为  (9600E81…)
下面是一个范例程序,使用自由协议,以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   1read_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,   &#8218;”FATEK FB Series”, RT, 5, 1)
endmacro_command
此处的  device_函数名称,即为在 &#8218;系统参数中建立  PLC 类型时,设定的PLC

名称。在此,PLC 名称被设定为 &#8218;FATEKFB Series,如下图所示。

威纶通触摸屏宏指令通讯函数图2

威纶通触摸屏宏指令通讯函数图2
device_type是设备类型和  PLC 中数据的编码方式。例如:如果  device_type
LW_BIN,那么读取的设备类型为  LW,数据编码方式为  BIN。如果使用  BIN 编码方
式,&#8218;_BIN&#8219; 可以忽略。
如果  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() 使用  &#8218;系统参数  /  设备列表中设

定的默认的站号,在此可以不填这个站号

威纶通触摸屏宏指令通讯函数图3

威纶通触摸屏宏指令通讯函数图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,&#8218;Local HMI&#8219;, 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_datadevice_函数名称、device_typeaddress_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, &#8218;Local HMI&#8219;, LB, 2, 1)
//  读取  LB-0 ~ LB-29   30  个状态,到变量  b[0] ~ b[29]
GetDataEx(b[0], &#8218;Local HMI&#8219;, LB, 0, 30)
//  读取  LW-2  的数据到变量  c  
GetDataEx(c, &#8218;Local HMI&#8219;, LW, 2, 1)
//  读取  LW-0 ~ LW-49   50  个字到变数  d[0]    d[49 ]
GetDataEx(d[0], &#8218;Local HMI&#8219;, LW, 0, 50)
//  读取两个字  LW-6 ~ LW-7 到变数  e  
//  注意此时变量  e  的类型为  int
GetDataEx(e, &#8218;Local HMI&#8219;, LW, 6, 1)
//  读取  LW-0 ~ LW-19   20  个字到变数  f[0] ~ f[9] 中,数组  f[10]  的变量类型定
义为  int
//  注意一个  int  资料将占据  2  个字符
GetDataEx(f[0], &#8218;Local HMI&#8219;, LW, 0, 10)
//  读取  LW-2 ~ LW-3   2  个字到变数  f  
GetDataEx(f, &#8218;Local HMI&#8219;, 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   1send_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,&#8218;Local HMI&#8219;, LB, 2, 1)
//  设定  LB0 ~ LB29   30  个位的状态
SetData(b[0],&#8218;Local HMI&#8219;, LB, 0, 30)
//  将变量  c  的值设定到  LW-2  
SetData(c,&#8218;Local HMI&#8219;, LW, 2, 1)
//  设定  LW-0 ~ LW-49   50  个数据
SetData(d[0],&#8218;Local HMI&#8219;, LW, 0, 50)
//  将变量  e  的值写入到  LW-6 ~ LW-7 两个寄存器中,注意变量  e  的类型为int
SetData(e,&#8218;Local HMI&#8219;, LW, 6, 1)
//  设定  LW-0 ~ LW-19   20  个字的数据
//10  个双整型数据等于  20    16  位整型数  (1个字符),因一个  int  数据将占据
2  个字符
SetData(f[0],&#8218;Local HMI&#8219;, 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_datadevice_函数名称、device_typeaddress_offsetdata_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,&#8218;Local HMI&#8219;, LB, 2, 1)
//  设定  LB0 ~ LB29   30  个位的状态
SetDataEx(b[0], &#8218;Local HMI&#8219;, LB, 0, 30)
//  将变量  c  的值设定到  LW-2  
SetDataEx(c, &#8218;Local HMI&#8219;, LW, 2, 1)
//  设定  LW-0 ~ LW-49   50  个数据
SetDataEx(d[0], &#8218;Local HMI&#8219;, LW, 0, 50)
//  将变量  e  的值写入到  LW-6 ~ LW-7 两个寄存器中,注意变量  e  的类型为int
SetDataEx(e, &#8218;Local HMI&#8219;, LW, 6, 1)
//  设定  LW-0 ~ LW-19   20  个字的数据
//10  个双整型数据等于  20    16  位整型数  (1个字符),因一个  int  数据将占据
2  个字符
SetDataEx(f[0], &#8218;Local HMI&#8219;, LW, 0, 10)
endmacro_command
4.     GetError
语法  GetError(err)
取得系统执行的错误码
例如:
macro_commandmain()
shorterr
charbyData[10]
GetDataEx(byData[0],&#8218;MODBUS RTU&#8219;, 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

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索