数据…:为实际的数据转换为ASCII码,个数为字节数乘2。 异或:异或从设备地址到异或字节前,异或值转换成2个ASCII码 CR:0x0d。
---------------------------------------------------------- 有了这些资料,程序就不难编写了。 先测试一下。
到proteus中,全速运行,这就打开了串口窗口。
在kingview中单击“读取”(见上一篇的最后一个图),可以看到如下字串:
@02E000000176
这个数据字串与地址,数据类型等有关,解读如下: 变量名 X0 X1 XO X1 X0 X1
如果切换成HEX显示,则可以看到字头和字 如:@02A400010274 HEX显示为:
OAT OAT FLORT FL @ 02 C ORT SHTE SHTE BY @ @ @02 C E1 02 4 E0 00004 1 02 4 A1 00004 0 0R 型 BY @02 0 A0 00002 4 0R C类头 @字设备地址 02 0 E1 00002 5 7R C志 E0 00001 7 7R C标数据地址 000数据字节 01 6 7R C或 7R C异R CC40 30 32 41 34 30 30 30 31 30 32 37 34 0D
其中取异或的,不包括字头40H,即从30H开始的10个字符,异或算出来后,转换成ASCII码成为其后的2个字符,即0D前的两个字符。以上面的数字为例,异或算出来为74H,转换成ASCII码为37H和34H。
五、总结
通过以上介绍与实例分析了解到组态王软件具有适应性强、开放性好、易于扩展、经济及开发周期短等优点。组态王强大及方便的功能还在随着科技的发展更加完善,认真学习组态王的应用将使我们在以后的工作中更加左右逢源。
参考文献
[1] 廖常初:《西门子人机界面(触摸屏)组态与应用技术(第2版)》 机械工业出版社 2006年3月;
[2] 紫金桥:《基于紫金桥的牵引变电所计算机监控》2006年8月;
[3] 上海超高压输变电公司:《变电所自动化与监控(第三册)》 中国电力出版社 2006.年7月;
[4] 姚卫丰 :《楼宇设备监控及组态》 机械工业出版社 2008年6月。
附件:实例程序: #include \/*11.0592M 19200 bps */
typedef unsigned char uchar; typedef unsigned int uint;
/*定时器2的波特率:fosc/32*(65536-(rcap2h rcap2l)) 按此,可得波特率是19。2时,要求65536-(rcap2h rcap2l)=18 即(rcap2h rcap2l)=65518 */
void serial_init () {
SCON = 0x50; /* mode 1: 8-bit UART, enable receiver */ C_T2=0; /*Timer2 runing in Timer mode*/ RCLK=\ TCLK=\ RCAP2H=0xff; RCAP2L=0xee;
TR2=1; /*enable Timer2 run */
ES = 1; REN=\时收到的第9位为1才置位RI标志*/ }
/*通过串行口发送数据 */ void UartSend(uchar Dat) { SBUF=Dat; for(;;) { if(TI) break; }
TI=0; }
uchar RecBuf[12];
bit RecOk=\一次接收工作结束
void Recive() interrupt 4 {
static bit StartRec=\如果收到的首个字符是40H,则该值取0 static uchar Count=\计数器 uchar RecDat;
RecDat=SBUF; //取得SBUF中的数据 if(!StartRec) //新的一次接收开始 {
if(RecDat==0x40) //首字符正确 {
StartRec=1; //开始新的一次接收工作 } } else {
RecBuf[Count]=RecDat; Count++; if(RecDat==0x0d) {
StartRec=0; //准备下一次接收 Count=0; //计数器清零 RecOk=1; //一次接收正确 } } RI=0; }
void UartSends(uchar Buff[],uchar Len) { uchar i;
for(i=0;i void mDelay(uint DelayTim) { uchar i; for(;DelayTim>0;DelayTim--) { for(i=0;i<123;i++); } } uchar SendBuf[10]={0x40,0x30,0x33,0x30,0x31,0x36,0x35,0x30,0x31,0x0d}; void main() { uchar i; uchar RecCount=\ uchar SendCount=\ uchar xorDat; uchar cTmp1,cTmp2;uchar cTmp; uchar SendDat=\这个是程序中准备传递给kingview的,可以自行更改。 serial_init (); //定时器,串口初始化 for(;;){ if(RecOk) //一次完整的接收 { RecOk=0; //本次接收后的应答处理完毕 xorDat=RecBuf[0]; for(i=1;i<10;i++) { xorDat^=RecBuf[i]; //异或