昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计

大家好,我是『芯知识学堂』的SingleYork,前面给大家介绍了“昆仑通态人机界面与单片机通信实战教程一:工程界面的设计”,今天笔者就要来给大家介绍“昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计”。

其实昆仑通态的软件也自带了很多标准设备的驱动,如:西门子PLC的驱动、三菱PLC的驱动等,直接加载驱动就可以用了,但是对于我们自己开发的单片机板的话,就需要自己编写驱动了。一说到脚本驱动,自然就离不开通信协议了,昆仑通态的软件支持标准的modbus协议,也支持自定义协议,对于我们这些不是很复杂的设备来说,个人觉得,没必要去深入研究modbus协议,尤其是菜鸟,自定义协议可能会更加实用,所以,笔者重点给大家介绍“自动义协议”。

我们先来看一下,我们之前设计好的HDMI工程:

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第1张图片

从这个HDMI工程中我们可以看到,一共有14个输入状态、12个输出状态和12个输出控制,其中:

14个输入状态可以用2个字节(BYTE),按位操作来实现状态的显示;

12个输出状态也可以用2个字节(BYTE),按位操作来实现状态的显示;

12个输出控制,我们可以也可以用2个字节(BYTE)来按位控制,也可以用12个BYTE来按控制,只是按位操作来控制的话,可能操作会麻烦一些,为了操作简单,我们就用12个BYTE来实现控制吧;

这样一来,我们就可以制定以下通信协议:

(1) 触摸屏读指令(0x80:一次性读取多个数据)

格式(十六进制):

主机发送(触摸屏):帧头(2)+ 长度(1)+ 功能码(1)+ 起始地址(2)+和校验(从长度位开始累加)

从机应答(单片机):帧头(2)+ 长度(1)+ 功能码(1)+ 数据一(输入状态一:X00-X07)+数据二(输入状态二:X10-X17)+ 数据三(输出状态一:Y00-T07))+ 数据四(输出状态二:Y10-X17)+和校验(从长度位开始累加)

例:
主机发送:37 73 04 80 0000 84
从机返回:5A A5 06 80 00 00 00 00 86

(2) 触摸屏写指令(0x81:写单个寄存器操作)

格式(十六进制):

主机发送(触摸屏):帧头(2)+ 长度(1)+ 功能码(1)+ 寄存器地址(2)+寄存器值(2)+和校验(从长度位开始累加)
例:37 73 06 81 0000 0001 88

写指令从机就不设置单独的返回指令了,在写完之后,可以通过读指令来查询状态来判断有没有写成功。

当然咯,笔者这里仅仅只是给大家演示了一个比较简单的通信协议,大家可以根据自己的实际项目需求去完善通信协议,这个就需要仁者见仁智者见智了。

好了,有了通信协议,我们就可以来开始写脚本驱动了,首先,我们安装一下“MCGS脚本驱动开发工具”,同样,这个工具的安装非常简单,笔者就不赘述了,大家直接到下面链接下载安装即可:

链接:https://pan.baidu.com/s/1CAoQ7AO7nl93eBggdfrwzg
提取码:o7oo

安装完成之后,我们鼠标右键单击桌面图标在这里插入图片描述
,“以管理员身份运行”(双击打开新建工程会出现一些奇怪的问题,可能跟系统也有关系吧)打开“MCGS脚本驱动开发工具”,并新建一个工程(选择“不使用向导新建立工程”):

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第2张图片

然后,在弹出的选项中,输入设备名为:昆仑通态屏与单片机通信演示,设备注释可以不写,设备类型选择“子设备”,界面类型选择“高级”:
昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第3张图片

设置完成后,点击“确定”按钮,一个新的工程就设置好了,然后就会出现如下界面:

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第4张图片

到这里,我们先把新建的工程保存一下,避免意外情况导致数据丢失又要重新弄,笔者之前就遇到过好几次突然停电的情况,结果有些东西忘记保存了,来电之后又要重新弄,比较气人哈……所以我们要养成良好的习惯,隔一段时间就保存一下。

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第5张图片

接下来,我们先把新建的这个工程里面的一些自带的内容删掉,比如,“设备通道”里的自带的AI01-AI08,“设备脚本”->“采集脚本”里面的一些脚本内容,等。当然咯,我们也可以在自带的内容基础上做修改,笔者这里就懒得一个个去修改了,索性直接全部删除吧:

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第6张图片

好了,该删的删完了,我们就可以来添加自己需要的东西了!首先,我们从前面知道,HDMI工程中需要显示14个输出状态和12个输出状态,而且都是用位变量来控制,那么,我们就先来添加这26个状态需要用到的“设备通道”吧,直接鼠标右键单击“设备通道”,在弹出的选项中选择“添加”:

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第7张图片

这个时候,我们可以选择一次只添加一个通道,或者一次性添加多个通道,同时要注意,我们的“通道类型”要选择“整数”,实际上我们本来应该要选择“位变量”的,但是很遗憾,没有这个选项,下拉框里只有“整数”和“浮点数”两个选项,从厂家技术那里得知:
如果我们这里需要用到“位变量”(也就是HDMI工程里面的“开关”类型),那么我们在这里就应该选择“整数”类型;

如果我们在HDMI工程里面需要用到“数值”类型的变量的话,我们这里就应该选择“浮点数”;

说实话,我也很纳闷同一个公司做出来的软件数据类型为啥不统一一下!

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第8张图片

在我们点击“确定”按钮后,我们就可以发现,在左侧的“设备通道”里就多出了X01-X08总共8个通道值。为什么是X01-X08而不是我们想要的X00-X07呢?这个应该是跟软件的默认下标有关系,经过笔者多次测试,好像默认序列下标是从1开始的!

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第9张图片

所以,这里如果我们需要建立通道变量名为X00-X07,我们可以先单独建立一个X00,然后再批量建7个X01-X07,或者就直接一个建吧,哈哈……按照同样的方法,我们将X10-X17、Y00-Y07、Y10-Y17依次建好(实用应用只需要用到X00-X10、X10-X15、Y00-Y07、Y10-Y13,其他的作为备用),同时,我们为了和后面的输出控制Y00-Y07、Y10-Y17做一个区分,我们在用于“状态显示”的这些通道变量名前面加一个“r”,也就是read变量类型,然后在用于按键控制输出的通道变量名前面加一个“w”,也就是write变量类型,这样,这些用作输入输出状态显示和输出控制的通道我们就设置好了,这里需要注意一下,用于输出控制的w_Y00- w_Y07、w_Y10- w_Y17通道的“通道类型”要设置为“浮点数”,因为我们在HDMI工程中,用的是“数值型”。

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第10张图片

接下来,我们就要开始动手写脚本了,在“设备脚本”里面一共有四个脚本,即:采集脚本、单通道写脚本、初始化脚本、退出脚本,一般情况下,我们只需要关注“采集脚本”和“单通道写脚本”即可。

那么,我们先来写“采集脚本”,首先,我们定义一些变量(变量名还可以为中文字符)用来缓存串口收到的数据,也就是通信协议里面,单片机返回的数据(帧头(2)+ 长度(1)+ 功能码(1)+ 数据一(输入状态一:X00-X07)+ 数据二(输入状态二:X10-X17)+ 数据三(输出状态一:Y00-T07))+ 数据四(输出状态二:Y10-X17)+和校验(从长度位开始累加)),根据通信协议,我们设置9个变量用作缓存就可以了(这里说明一下,按理说,在后面的程序中定义了一个数组“DIM nRecvByteArr(9) AS BYTE”应该是可以直接做缓存的,但是在调试的时候发现,好像不能直接使用这个数组元素来参与计算,不知道为什么!感兴趣的童鞋,也可以去尝试一下)。

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第11张图片
昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第12张图片

接下来,我们来写“采集脚本”中的“读指令”相关的程序,这里我们还定义了一个全局变量Send_Busy,用于串口发送判忙,只有当Send_Busy = 0的时候,才发送读指令,所以这里用了一个IF语句来做判断:

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第13张图片

在这里,我们用到了2个跟串口收发相关的函数,一个是!SvrByteArraySum()函数,一个是!DevWriteAndReadByteArr()函数,这两个函数的用法我们可以通过脚本驱动工具自带的帮助文档查找具体使用方法,笔者就不再赘述了:

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第14张图片
昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第15张图片

再接下来,我们就要来写“采集脚本”中比较关键的串口数据解析相关的程序了,在数据解析函数中,我们需要判断两个帧头以及校验和,只有两者都正确,才解析数据,具体操作如下:

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第16张图片
昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第17张图片

这个部分又用到了三个函数!I2Bin()、!Mid()和!Bin2I(),同样,在帮助文档里面,我们可以看到这三个函数的详细介绍:

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第18张图片
昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第19张图片
昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第20张图片

接下来,就是“采集脚本”的最后一个操作了—通道绑定。同样的,数据通道的绑定也是通过一个函数来实现的,这个函数就是:!SetIntChannelValueByName(),他还有一个兄弟是:!SetSingleChannelValueByName(),只是操作的数据类型不同而已。

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第21张图片

由于我们这里操作的都是INTEGER类型的变量,所以只需要用!SetIntChannelValueByName()函数即可:

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第22张图片

到这里,我们的“采集脚本”就写完了,接下来,我们就可以开始写“单通道写脚本”,这个脚本主要是用来实现按键的操作,或者参数设置的场合,当然咯,本例中主要还是用于按键操作,代码如下:

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第23张图片
昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第24张图片

至此,脚本驱动就写完了,我们可以检查一下驱动,看到下面显示“设备编译检查通过”,基本可以确定我们的脚本没什么问题了(至于有没有问题,还得联机运行了才知道,哈哈)。在这个“单通道写脚本”中,我们也用到了几个函数:!GetCurrentChannelNum()、!GetSingleChannelValueByNum()、!BitRShift(),关于这三个函数的说明,详见“帮助文档”,前面已经介绍过如何在“帮助文档”中查找这些函数的说明了,笔者就不再赘述了!

好了,今天的内容就给大家介绍到这里了,内容有点长,大家慢慢消化吧,在下一篇文章中,笔者将要给大家介绍“如何将脚本驱动程序和HDMI工程关联起来”,敬请期待!

喜欢工控的小伙伴们,请大家记得多多支持SingleYork!项目源码下载:昆仑通态人机界面与单片机通信实例源码

昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计_第25张图片

你可能感兴趣的:(昆仑通态人机界面与单片机通信实战教程二:脚本驱动的设计)