以前第一次接触MCGS的时候,是因为北京昆仑通态的触摸屏。在开始要求上下位机进行通信的时候,主要是与单片机---ARM进行串口的数据交换---主要实现----触摸屏发送指令去控制外围设备----同时从下位机返回采集到的数据。
在网上找了很久的资料,也看了MCGS自带的帮助文档,但是都没有通信成功。后来在一个博客上 http://www.wlcpu.com/archives/1570 看到版主介绍他的方法,是采用Modbus与单片机完成了通信----通过一段时间的学习与请教,也完成了通信-----但是后来我在进一步学习MCGS中发现这种方法太麻烦,首先它在单片机中的代码实在太多,就为了实现几组数据的交换,基本上单片机都在处理通信交换。
后来在阅读了MCGS的帮助后,了解到MCGS的脚本开发工具可以实现MCGS的通信,可是说起来容易,做起来难,虽然按照它的介绍一步步完成,可最后还是只能接受数据,不能发送指令,当时自己脑袋都大了。还好功夫不负有心人,最后还是成功了,在成功之后,站在一个了解基本内容的角度,反过来看自己当初作为一个初学者,一个完全不懂的人,如今的简单易懂在当初就是丈二和尚。
所以在这里简单介绍一下脚本代码------注意这里现在只是代码------时间问题------以后会将如何自动生成代码介绍的。
------------------------------
这是脚本开发工具------------
----------------------------------------------
代码如下-----------------------------现在只看代码就只需要注意红色部分------------------------------------
'———————————————————————
'驱动脚本:采集函数脚本,MCGS将定时调用这个函数
'这个函数需要完成从设备获取数据,并将数据根据协议
'进行解析,最后赋值到相应通道上的功能。
'这部分是注释,请在下面编辑采集脚本的内容:
'———————————————————————
'定义通道索引变量
DIM nIndex as INTEGER '当前回收数据解析通道的偏移索引
DIM nChlIndex as INTEGER '当前回收数据解析通道的起始索引
'定义ASCII协议格式命令收发帧使用变量
DIM strSend as STRING '存放发送命令字符变量
DIM strRec as STRING '存放接收命令字符变量
DIM strTmp as STRING '临时字符变量
DIM strData as STRING '
’下面红色的9个变量代表将要从组态传递9个数据----也就是指令------如果需要增加或者减少指令---可以相应增加减少----同时需要相应修改后面数据---
DIM str1 as STRING '接收从组态中传递的变量值
DIM str2 as STRING '接收从组态中传递的变量值
DIM str3 as STRING '接收从组态中传递的变量值
DIM str4 as STRING '接收从组态中传递的变量值
DIM str5 as STRING '接收从组态中传递的变量值
DIM str6 as STRING '接收从组态中传递的变量值
DIM str7 as STRING '接收从组态中传递的变量值
DIM str8 as STRING '接收从组态中传递的变量值
DIM str9 as STRING '接收从组态中传递的变量值
DIM nReturn1 as INTEGER '函数返回判断标志(str是否接收到字符串)
'定义HEXE协议格式命令收发帧使用变量
dim SendByteArr(0) as byte '存放发送命令字节数组
dim RecByteArr(0) as byte '存放接收命令字节数组
dim DataByteArr(0) as byte '存放解析数据临时字节数组
DIM nReturn as INTEGER '函数返回判断标志
DIM nTmp as INTEGER '开关型临时变量
DIM 数值数据 as SINGLE '解析数值型数据,对数值型通道赋值
DIM 开关数据 as INTEGER '解析开关型数据,对开关型通道赋值
nIndex = 0
nChlIndex = 0
‘请注意---这是与前面9个变量相对应的----其中CT*是在组态中定义的数据---其作用就是将组态中定义的CT*数据传到前面定义的9个变量值中-----这九个变量值将在后面使用------------
nReturn1=!GetStrDataValueByName ("CT1",str1)'设备地址1-组态中的变量
!GetStrDataValueByName ("CT2",str2)
!GetStrDataValueByName ("CT3",str3)
!GetStrDataValueByName ("CT4",str4)
!GetStrDataValueByName ("CT5",str5)
!GetStrDataValueByName ("CT6",str6)
!GetStrDataValueByName ("CT7",str7)
!GetStrDataValueByName ("CT8",str8)
!GetStrDataValueByName ("CT9",str9)
'------------------第0帧收发脚本--------------------
strTmp = "0" + !I2Hex(设备地址)
strTmp = !right(strTmp,1)
'strSend = "##" + strTmp + "&&"
’注意下面----strSend=后面的一段代码表示将前面接收到的9个变量转化为字符串-----这里是----##123456789**------数字随意说的----要根据你组态中将对应的CT*数据设为多少----
if nReturn1=0 then strSend ="##"+ !trim(str1)+!trim(str2)+ !trim(str3)+ !trim(str4)+ !trim(str5)+ !trim(str6)+ !trim(str7)+ !trim(str8)+!trim(str9)+"**"
'发送和接收数据按如下方式:
'!DevReadStr(strRec,60,通讯延时)
'if !strComp(strSend,"##41000000**")=0 then !DevWriteStr(strSend)
nReturn = !DevWriteAndReadStr(strSend,strRec,60,通讯延时)
if nReturn < 60 then
!SetIntChannelValueByName("通讯状态",2)
exit
endif
‘下面表示接收8个数据回组态----其实当你与单片机进行通信时,就是简单的数据通信,比如232---485--等,发送的就是一串字符---比如12345679921313142413113---然后你要确定你的数据格式--比如每4位表示一个数据----你要接受的就是1234---5679--9213-----------当然下面是7个字符表示一个数据------自己可以根据需要修改!
'解析回收数据,并设置通道值
nIndex = 0
while nIndex < 8
strTmp = !mid(strRec,nIndex*7+3,7)
数值数据 = !Val(strTmp)
开关数据 = 数值数据
!SetSingleChannelValueByNum(nIndex+nChlIndex+2,数值数据)
nIndex = nIndex + 1
endwhile
nChlIndex = nChlIndex + nIndex
!SetIntChannelValueByName("通讯状态",0)
------------------------------
编译通过后生成---mdr文件
-----将他放在MCGS安装目录下的驱动文件夹中----比如----
----然后再组态的设备窗口中添加设置-----
----------------------------------最后简单通信效果------
1.组态发送的指令-----我这里的指令时自己添加了个数的---
2.串口助手模拟采集数据发送给组态
3.组态接收到串口助手发送的字符串---每7位代表一个数据
4----------------------
5---------------
最后再次将源码贴出---------------
'———————————————————————
'驱动脚本:采集函数脚本,MCGS将定时调用这个函数
'这个函数需要完成从设备获取数据,并将数据根据协议
'进行解析,最后赋值到相应通道上的功能。
'这部分是注释,请在下面编辑采集脚本的内容:
'———————————————————————
'定义通道索引变量
DIM nIndex as INTEGER '当前回收数据解析通道的偏移索引
DIM nChlIndex as INTEGER '当前回收数据解析通道的起始索引
'定义ASCII协议格式命令收发帧使用变量
DIM strSend as STRING '存放发送命令字符变量
DIM strRec as STRING '存放接收命令字符变量
DIM strTmp as STRING '临时字符变量
DIM strData as STRING '
DIM str1 as STRING '接收从组态中传递的变量值
DIM str2 as STRING '接收从组态中传递的变量值
DIM str3 as STRING '接收从组态中传递的变量值
DIM str4 as STRING '接收从组态中传递的变量值
DIM str5 as STRING '接收从组态中传递的变量值
DIM str6 as STRING '接收从组态中传递的变量值
DIM str7 as STRING '接收从组态中传递的变量值
DIM str8 as STRING '接收从组态中传递的变量值
DIM str9 as STRING '接收从组态中传递的变量值
DIM nReturn1 as INTEGER '函数返回判断标志(str是否接收到字符串)
'定义HEXE协议格式命令收发帧使用变量
dim SendByteArr(0) as byte '存放发送命令字节数组
dim RecByteArr(0) as byte '存放接收命令字节数组
dim DataByteArr(0) as byte '存放解析数据临时字节数组
DIM nReturn as INTEGER '函数返回判断标志
DIM nTmp as INTEGER '开关型临时变量
DIM 数值数据 as SINGLE '解析数值型数据,对数值型通道赋值
DIM 开关数据 as INTEGER '解析开关型数据,对开关型通道赋值
nIndex = 0
nChlIndex = 0
nReturn1=!GetStrDataValueByName ("CT1",str1)'设备地址1-组态中的变量
!GetStrDataValueByName ("CT2",str2)
!GetStrDataValueByName ("CT3",str3)
!GetStrDataValueByName ("CT4",str4)
!GetStrDataValueByName ("CT5",str5)
!GetStrDataValueByName ("CT6",str6)
!GetStrDataValueByName ("CT7",str7)
!GetStrDataValueByName ("CT8",str8)
!GetStrDataValueByName ("CT9",str9)
'------------------第0帧收发脚本--------------------
strTmp = "0" + !I2Hex(设备地址)
strTmp = !right(strTmp,1)
'strSend = "##" + strTmp + "&&"
if nReturn1=0 then strSend ="##"+ !trim(str1)+!trim(str2)+ !trim(str3)+ !trim(str4)+ !trim(str5)+ !trim(str6)+ !trim(str7)+ !trim(str8)+!trim(str9)+"**"
'发送和接收数据按如下方式:
'!DevReadStr(strRec,60,通讯延时)
'if !strComp(strSend,"##41000000**")=0 then !DevWriteStr(strSend)
nReturn = !DevWriteAndReadStr(strSend,strRec,60,通讯延时)
if nReturn < 60 then
!SetIntChannelValueByName("通讯状态",2)
exit
endif
'解析回收数据,并设置通道值
nIndex = 0
while nIndex < 8
strTmp = !mid(strRec,nIndex*7+3,7)
数值数据 = !Val(strTmp)
开关数据 = 数值数据
!SetSingleChannelValueByNum(nIndex+nChlIndex+2,数值数据)
nIndex = nIndex + 1
endwhile
nChlIndex = nChlIndex + nIndex
!SetIntChannelValueByName("通讯状态",0)
-------------------------------手上有几块9成新的昆仑通态的触摸屏----------打折处理-------有需要可以留言----
------------------------------------------
--------------------------------
------------------------------
------------------------------------------详细内容还待完善,有需要的朋友可以留言!---------------------------