中国工控网 www.chinakong.com

中国自动化企业中心

企业目录

新闻中心

风采图片

产品中心

企业论坛

技术中心

资料下载

供求信息

招聘信息

上海诺达佳工业控制技术有限公司

http://www.kjgzs.com

首页  | 企业简介企业风采企业新闻产品目录企业论坛技术支持资料下载供求信息招聘信息留言信箱联系我们

所在位置:上海诺达佳工业控制技术有限公司 -- 企业论坛 -- 技术论坛1 -- 单片机与人机界面通讯的最简单方法

网站搜索:

企业目录

          企业首页

          企业简介

          企业风采

          企业新闻

          产品目录

          企业论坛

          4 技术论坛1

          技术支持

          资料下载

          留言信箱

          联系我们

发表人:wqlcd_911 发表时间:2011/11/1 15:01:00  

 

 本栏论题: 单片机与人机界面通讯的最简单方法  [5245] 
    
   
    很多时候,工业控制或者产品设计方面受到PLC这种功能确定,扩展麻烦,成本昂贵等方面的制约因素,需要独立开发一种特殊功能,但是又需要连接触摸屏通讯,工程师在这个方面往往需要花费很大功夫,现在我要帮大家解决的问题就是 单片机与人机界面触摸屏通讯的最简单,最有效的 2种方法,其实就是分为2种通讯协议,即工业标准的 Modbus RTU协议和 工程师自己定义的 自由协议。
   
   

单片机与人机界面通讯的最简单方法


   
    本实例采用广州市微嵌计算机科技有限公司(公司网站:[url]http://www.wqlcd.com[/url])的人机界面作为参考,因为公司提供一系列的技术支持和公布单片机源代码,加上公司的人机界面支持自由协议等等先天优势,开发工程方便有效。
    方案比较:
    方案一 modbus—rtu协议:
    优点:工业标准通讯协议,具有通用性,,传输数据量大
    缺点:需要时间去了解协议的格式和以及按照规定编写通讯程序(我们提供MODBUS-RTU源代码,客户直接移植就可以,不必费心)
    方案二 自由协议:
    优点:数据格式客户自己定义,灵活多变,定制性强,可以模拟任何已知报文的通讯协议
    缺点:传输数据量不大,通用性不强,移植不方便
   
   
    工程师可以根据以上两种通讯协议的优缺点来选择理想的方案;
   
    实现方法:首先下载公司的人机界面组态软件(下载地址[url]http://dl.dbank.com/c0c85mpr86[/url] 用户名: wqlcd_911@163.com 密码:123456)
    方案一:
    1. 工程属性选用MODBUS-RTU协议;
    2. 先了解MODBUS-RTU协议,基本的01 03 05 06 16 的功能码需要了解,其他可以不去深究;提供相关的资料
    3. 使用我们提供的MODBUS-RTU协议(C语言)开发源代码,把主要的01 03 05 06 16 函数移植到单片机通讯上,大大节省了开发时间;
   
   

单片机与人机界面通讯的最简单方法


   
    方案二:
    1. 工程属性选用FreeProtocol协议;
   
   

单片机与人机界面通讯的最简单方法


   
    3. 打开控制令编辑器(设定—>宏指令—>宏指令编辑器)或者直接按F8;
    4. 新增宏指令,在宏指令里面使用到Output()、Input()、SetWordData()、GetWordData()这四个函数;注:可以参考附一
    5. Output()函数,把设定好的字符串发送到相应的串口输出;Input()函数,从设定好的串口读取需要的字符串;
    6. 采集显示:
    SetWordData()函数,把Input()函数接收回来的数据,发送给HIM用户自定义寄存器里,然后在显示控件里填上已经有数据的HIM寄存器,即可显示单片机采集上来的数据;
    7. 改写发送:
    在显示控件了把需要改写的数据绑定HIM寄存器,使用GetWordData()获得修改后的数据,通过output()发送把数据发送到单片机;
   
    资料下载:
    [url]http://dl.dbank.com/c0e9kek2e1[/url]
    Output();
    【描述】
    第一个参数channel表示通道,如果通道为com1,则channel=1;如果通道为com2,则channel=2,数据类型为int。
    第二个参数pString表示从通道输出的字符串的地址,数据类型为unsigned char *。
    第三个参数count表示字符串中的字符个数,数据类型为int。
    第四个参数result表示Output函数运行后返回的结果,如果result大于0,则表示读写有效,数据类型为int。
    注意:此函数只能用在freeprotocol(自由协议通道)中。
    【用法】
    Output(channel,pString,count,result);
    【举例】
    char srt[9];
    int result;
    Output(1,str[0],9,result);
   
   
   
    Input();
    【描述】
    第一个参数channel表示通道,如果通道为com1,则channel=1;如果通道为com2,则channel=2,数据类型为int。
    第二个参数pString表示写入通道的字符串的地址,数据类型为unsigned char *。
    第三个参数count表示字符串中的字符个数,数据类型为int。
    第四个参数result表示Output函数运行后返回的结果,如果result大于0,则表示读写有效,数据类型为int。
    注意:此函数只能用在freeprotocol(自由协议通道)中。
    【用法】
    Input(channel,pString,count,result);
    【举例】
    char srt[9];
    int result;
    Input(1,str[0],9,result);
   
    GetWordData();
    【描述】
    函数功能:从通道中读取Word数据。
    第一个参数channel表示通道,数据类型为unsigned char。
    第二个参数slaveID表示从机号,数据类型为unsigned char。
    第三个参数address表示系统通道地址,数据类型为unsigned short。
    第四个参数count表示要读出的字的个数,数据类型为unsigned short。
    第五个参数表示命令号,数据类型为unsigned char。
    第六个参数pvalue用来保存从系统通道读出的count个字,数据类型为unsigned short *。
    【用法】
    GetWordData(channel,slaveID,address,count,cmd,pvalue);
    【举例】
    unsigned short wordData[10];
    GetWordData(0, 1,8000, 10, 0,wordData);
    从系统通道 8000地址中读取10个数据到wordData
   
    SetWordData();
    【描述】
    函数功能:从通道中写入一个Word数据。
    第一个参数channel表示通道,数据类型为unsigned char。
    第二个参数slaveID表示从机号,数据类型为unsigned char。
    第三个参数address表示系统通道地址,数据类型为unsigned short。
    第四个参数cmd表示命令号,数据类型为unsigned char。
    第五个参数pvalue用来保存写入系统通道的字,数据类型为unsigned short。
    【用法】
    SetWordData(channel,slaveID,address,cmd,source);
    【举例】
    unsigned short wordData = 1;
    SetWordData(0, 1,1000,0,wordData);
    把wordData中的Word数据写到系统通道 1000地址处
   
   
    附录二:
    使用自由协议来模拟modbus-RTU
   
    //COM1:freeprotocol
    //COM2:modbus-RTU
    /*自由协议通道采集数据存放在系统通道,在界面显示
    modbus通道采集到的数据,处理后,发送到自由协议的设备上*/
    unsigned char command[32];
   
    unsigned char response[32];
   
    unsigned char temp1,temp2;
   
    unsigned short address, checksum;
   
    unsigned short read_no, return_value1, return_value2,return_value3,read_data[2], i;
   
    unsigned short com2_data;
    /****************以上是新建需要使用的变量***********/
   
    Fill(command, 0, 32);// initialize command[0]~command[31] to 0
   
    Fill(response, 0, 32); //把command 和response 初始化
   
    command[0] = 0x1;// 设置发送字符窜的第一个数据 station number
   
    command[1] = 0x3;// 设置发送字符窜的第二个数据 read holding registers (function code is 0x3)
   
    address = 0;// starting address (4x_1) is 0
   
    HiByte(address, command[2]);//设置发送字符窜的第三个数据
   
    LoByte(address, command[3]);//设置发送字符窜的第四个数据
   
    read_no = 2;// the total words of reading is 2 words
   
    HiByte(read_no, command[4]);//设置发送字符窜的第五个数据
   
    LoByte(read_no, command[5]);//设置发送字符窜的第六个数据
   
    CRC(command, 6,checksum);// calculate 16-bit CRC
   
    LoByte(checksum, command[6]); //设置发送字符窜的第七个数据
   
    HiByte(checksum, command[7]); //设置发送字符窜的第八个数据
   
    Output(1,command,8, return_value1); //把设置好的8个数据,从通讯口1发送出去,具体参数设置参考Output()使用
   
    Input(1,response,9,return_value2); //从通讯口1等待接收9个字符数据,并且放在response[0]~response[8],具体参数设置参考Intput()使用
   
    CRC(response, 7,checksum); //对采集上来的9个数据中前7个进行了CRC-16校验,校验结果存放在checksum
   
    LoByte(checksum, temp1); //把checksum的低8位放在temp1
   
    HiByte(checksum, temp2); //把checksum的高8位放在temp1
   
    if(temp1==response[7]&&temp2==response[8]) //CRC校验码进行对比判别时候接收正确
   
    {
    //CRC检验正确后,把采集来的数据中指定需要的数据放在read_data[]
    read_data[0] = response[4] + (response[3] << 8);
   
    read_data[1] = response[6] + (response[5] << 8);
   
    SetWordData(0 ,1 ,0 ,2,0 , read_data); // 通过SetWordData()函数,把read_data送到系统寄存器中,具体使用需要参考SetWordData()函数使用
    }
   
    GetWordData( 2, 1, 2, 2, 3, &com2_data); // 通讯口2,使用的是modbus-RTU协议,
   
    command[0] = 0x1;// station number
   
    command[1] = 0x6;// wirte holding registers (function code is 0x6)
   
    address=10;
   
    checksum=0;
   
    HiByte(address, command[2]);
   
    LoByte(address, command[3]);
   
    HiByte(com2_data, command[4]);
   
    LoByte(com2_data, command[5]);
   
    CRC(command, 6,checksum);// calculate 16-bit CRC
   
    LoByte(checksum, command[6]);
   
    HiByte(checksum, command[7]);
   
    Output(1,command,8, return_value3); //发出定义好8个字符串
   
   

以下是关于《单片机与人机界面通讯的最简单方法》论题的回复(共20篇,分2页显示)

 共2页  第2页  页次: 首页  上一页   

回复人:zwk34

 回复时间:2016/9/1 21:25:00

 

    广告做得好,例子也不错。

回复人:maqihong

 回复时间:2019/7/10 19:47:00

 

    学习了

回复人:渡口小镇

 回复时间:2020/3/4 14:10:00

 

    有没有搞单片机开发的啊,我有东西要开发

回复人:lilin258

 回复时间:2021/4/10 16:03:00

 

    路过

回复人:rdhhzjz6

 回复时间:2021/5/9 7:52:00

 

    学习下

回复人:rdhhzjz6

 回复时间:2021/5/13 10:30:00

 

    学习下

回复人:雨辰5211314

 回复时间:2021/6/15 9:30:00

 

    资料不错,可以用来了解一下

回复人:63199

 回复时间:2023/7/1 23:18:00

 

    辛苦楼主了,学习一下

回复人:qwer2006

 回复时间:2023/8/4 11:28:00

 

    学习了,受益匪浅!

回复人:qwer2006

 回复时间:2023/8/4 11:32:00

 

    好帖!感谢楼主!

 共2页  第2页   首页  页次: 1  2      上一页   

如果要回复本栏论题,请首先中国工控网www.chinakong.com

·如果你已经是中国工控网成员,请直接登录。

·如果你还不是中国工控网成员,请首先注册,注册为免费!

注册名:

密  码:

           注册中国工控网www.chinakong.com
           忘记密码

关闭该窗口

上海诺达佳工业控制技术有限公司

联系地址:上海市闵行区申南路59号      邮政编码:201108

联系电话:13370235519/13636328346      传真:021-34635170      电子信箱:xxz20000@163.com       管理入口

中国工控网(www.chinakong.com)技术支持