品牌
经销商厂商性质
宁波市所在地
触摸屏6AV6643
公司自成立以来一直以“做神州工控先锋,创民族软件精华”为奋斗目标,积极开拓,勇于进取,不断的推出工控组态软件及硬件产品。公司先后推出了MCGS通用版、MCGS网络版、MCGS嵌入版等各种功能的组态软件。到目前为止,产品遍布环保、石油、航天、制药、煤矿、水处理、电力、化工、冶金、矿山、运输、机械、食品等几十个行业。2002年8月,公司推出了mcgsTpc系列嵌入式HMI(人机界面)产品,形成了从7寸、10.2寸、10.4寸、12.1寸到15寸完整的HMI(人机界面)产品系列,为用户提供了解决方案。
方案比较:
方案一modbus—rtu协议:
优点:工业标准通讯协议,具有通用性,,传输数据量大
缺点:需要时间去了解协议的格式和以及按照规定编写通讯程序(我们提供MODBUS-RTU源代码,客户直接移植就可以,不必费心)
方案二自由协议:
优点:数据格式客户自己定义,灵活多变,定制性强,可以模拟任何已知报文的通讯协议
缺点:传输数据量不大,通用性不强,移植不方便
客户可以根据以上两种通讯协议的优缺点来选择理想的方案;
实现方法:
方案一:
1.工程属性选用MODBUS-RTU协议;
2.先了解MODBUS-RTU协议,基本的01030 50616的功能码需要了解,其他可以不去深究;提供相关的资料
3.使用我们提供的MODBUS-RTU协议(C语言)开发源代码,把主要的01030 50616函数移植到单片机通讯上,大大节省了开发时间;
方案二:
1.工程属性选用FreeProtocol协议;
2.
3.打开控制令编辑器(设定—>宏指令—>宏指令编辑器)或者直接按F8;
4.新增宏指令,在宏指令里面使用到Output()、Input()、SetWordData()、GetWordData()这四个函数;注:可以参考附一
5.Output()函数,把设定好的字符串发送到相应的串口输出;Input()函数,从设定好的串口读取需要的字符串;
6.采集显示:
SetWordData()函数,把Input()函数接收回来的数据,发送给HIM用户自定义寄存器里,然后在显示控件里填上已经有数据的HIM寄存器,即可显示单片机采集上来的数据;
7.改写发送:
在显示控件了把需要改写的数据绑定HIM寄存器,使用GetWordData()获得修改后的数据,通过output()发送把数据发送到单片机;
附一:
Output();
【描述】
一个参数channel表示通道,如果通道为com1,则channel=1;如果通道为com2,则channel=2,数据类型为int。
第二个参数pString表示从通道输出的字符串的地址,数据类型为unsignedchar*。
第三个参数count表示字符串中的字符个数,数据类型为int。
第四个参数result表示Output函数运行后返回的结果,如果result大于0,则表示读写有效,数据类型为int。
注意:此函数只能用在freeprotocol(自由协议通道)中。
【用法】
Output(channel,pString,count,result);
【举例】
charsrt[9];
intresult;
Output(1,str[0],9,result);
Input();
【描述】
一个参数channel表示通道,如果通道为com1,则channel=1;如果通道为com2,则channel=2,数据类型为int。
第二个参数pString表示写入通道的字符串的地址,数据类型为unsignedchar*。
第三个参数count表示字符串中的字符个数,数据类型为int。
第四个参数result表示Output函数运行后返回的结果,如果result大于0,则表示读写有效,数据类型为int。
注意:此函数只能用在freeprotocol(自由协议通道)中。
【用法】
Input(channel,pString,count,result);
【举例】
charsrt[9];
intresult;
Input(1,str[0],9,result);
GetWordData();
【描述】
函数功能:从通道中读取Word数据。
一个参数channel表示通道,数据类型为unsignedchar。
第二个参数slaveID表示从机号,数据类型为unsignedchar。
第三个参数address表示系统通道地址,数据类型为unsignedshort。
第四个参数count表示要读出的字的个数,数据类型为unsignedshort。
第五个参数表示命令号,数据类型为unsignedchar。
第六个参数pValue用来保存从系统通道读出的count个字,数据类型为unsignedshort*。
【用法】
GetWordData(channel,slaveID,address,count,cmd,pValue);
【举例】
unsignedshortwordData[10];
GetWordData(0,1,8000,10,0,wordData);
从系统通道8000地址中读取10个数据到wordData
SetWordData();
【描述】
函数功能:从通道中写入一个Word数据。
一.个参数channel表示通道,数据类型为unsignedchar。
二.个参数slaveID表示从机号,数据类型为unsignedchar。
三.个参数address表示系统通道地址,数据类型为unsignedshort。
四.个参数cmd表示命令号,数据类型为unsignedchar。
五.个参数pValue用来保存写入系统通道的字,数据类型为unsignedshort。
【用法】
SetWordData(channel,slaveID,address,cmd,source);
【举例】
unsignedshortwordData=1;
SetWordData(0,1,1000,0,wordData);
把wordData中的Word数据写到系统通道1000地址处
附录二:
使用自由协议来模拟modbus-RTU
//COM1:freeprotocol
//COM2:modbus-RTU
/*自由协议通道采集数据存放在系统通道,在界面显示
modbus通道采集到的数据,处理后,发送到自由协议的设备上*/
unsignedcharcommand[32];
unsignedcharresponse[32];
unsignedchartemp1,temp2;
unsignedshortaddress,checksum;
unsignedshortread_no,return_value1,return_value2,return_value3,read_data[2],i;
unsignedshortcom2_data;
/****************以上是新建需要使用的变量***********/
Fill(command,0,32);//initializecommand[0]~command[31]to0
Fill(response,0,32);//把command和response初始化
command[0]=0x1;//设置发送字符窜的一个数据stationnumber
command[1]=0x3;//设置发送字符窜的第二个数据readholdingregisters(functioncodeis0x3)
address=0;//startingaddress(4x_1)is0
HiByte(address,command[2]);//设置发送字符窜的第三个数据
LoByte(address,command[3]);//设置发送字符窜的第四个数据
read_no=2;//thetotalwordsofreadingis2words
HiByte(read_no,command[4]);//设置发送字符窜的第五个数据
LoByte(read_no,command[5]);//设置发送字符窜的第六个数据
CRC(command,6,checksum);//calculate16-bitCRC
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;//stationnumber
command[1]=0x6;//wirteholdingregisters(functioncodeis0x6)
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);//calculate16-bitCRC
LoByte(checksum,command[6]);
HiByte(checksum,command[7]);
Output(1,command,8,return_value3);
触摸屏6AV6643