您现在所在的是:

PLC论坛

回帖:7个,阅读:1207 [上一页] [1] [下一页]
663
zhgk1214
文章数:12
年度积分:50
历史总积分:663
注册时间:2013/4/8
发站内信
发表于:2013/4/9 15:04:09
#0楼
用VC++6.0编写串行通信程序
   首先建立一个基于对话框的MFC应用程序SCommTest,支持ActiveX控件,电话形状的控件是在系统中注册过的MicrosoftCommunications Control, version 6.0,接受缺省的选项。
1.打开串口设置串口参数
在主对话框CSCommTestDlg::OnInitDialog()中打开串口,加入如下代码:
if(m_ctrlComm.GetPortOpen())

m_ctrlComm.SetPortOpen(FALSE);

m_ctrlComm.SetCommPort(1); //选择com1

if ( !m_ctrlComm.GetPortopen( ))m_ctrlComm .

SetPortOpen(TRUE);//打开串口

else

AfxMessageBox("cannot open serial port");

m_ctrlComm.SetSettings("9600,E,7,2"); //波特率9600,偶校验,7个数据位,2个停止位m_ctrlComm.SetInputModel(1); //1:表示以二进制方式检取数据m_ctrlComm.SetRThreshold(1);

//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0

m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据

   发送数据
  为发送按钮添加一个单击消息BN_CLICKED处理函数,选择IDC_BUTTON_MANUALSEND,添加OnButtonManualsend()函数,并在函数中添加如下代码:

UpdateData(TRUE); //读取编辑框内容

SendData(m_strTXData1,6);

// m_strTXData1表示发送速度命令的具体数值,6表示写数据的地址DM0006

Sleep(100);

SendData(m_strTXData2,12); //m_strTXData1表示发送时间命令的具体数值,12表示写数据的地址DM0012

2.发送命令

按照命令格式,本课题主要发送两个WD命令:

(1)数据采用十进制发送,向DM0006中写入速度指令;

(2)数据采用十进制发送,向DM0012中写入时间指令。部分程序如下:

Void CSCommTestDlg::SendData(int m_TobeSend,intm_address)

{ CByteArray Array;

unsigned char auchMsg[45]={0}

auchMsg[0]=64; // 起始标志符

auchMsg[1]=0x0; //节点号

auchMsg[2]=0x0; auchMsg[3]=‘W‘; //命令符

auchMsg[4]=‘D‘;

auchMsg[5]=m_address/1000;

auchMsg[6]=(m_address%1000)/100;

auchMsg[7]=(m_address%100)/10;

auchMsg[8]=m_address%10;

auchMsg[9]=m_TobeSend/1000;

auchMsg[10]=(m_TobeSend%1000)/10;

auchMsg[11]=(m_TobeSend%100)/10;

auchMsg[12]=m_TobeSend%10;

LRC(auchMsg,13);

//auchMsg[13] ,auchMsg[14] ,保存FCS值

auchMsg[15]=‘*‘; //命令结束符

auchMsg[16]=13;

Array.RemoveAll();

for (Count=0;Count<17;Count++)

Array.Add(auchMsg[Count]);

m_ctrlComm.SetOutput(COleVariant(Array));

3.计算校验码函数

unsigned char uchLRC = 0 ; 初始值设定

while (usDataLen——)

{uchLRC ︿= *auchMsg++; }

unsigned char high=0xF0;

//high为校验码的高位

unsigned char low=0x0F;

//low为校验码的低位

high&=uchLRC;

low&=uchLRC;

high>>=4;右移四位

if(high<=9)

high=high+48;
else
high=high+55;
if(low<=9)
low=low+48;
else
low=low+55;
auchMsg++=high;
auchMsg++=low;

   此程序在VC++6.0中运行通过,并成功应用于振动磨的控制中。该系统采用OMRON XA40DR-A PLC与上位机连接组成控制系统,上位机通过串行口向PLC发出写命令及数据,PLC接受数据后,通过D/A转换模块,将模拟量发给变频器,从而实现了振动磨振动速度和时间的控制。
机电之家  机电行业贸易推广网站
11770
gzg_00
文章数:8996
年度积分:59
历史总积分:11770
注册时间:2009/10/1
发站内信
发表于:2013/4/9 20:24:08
#1楼
感谢楼主的无私


听庆MM说过,感谢的可以发,就谢一下了
15623
step1
文章数:7314
年度积分:35
历史总积分:15623
注册时间:2008/4/10
发站内信
2017国庆活动(三)
2016国庆活动(三)
2013辞旧迎新
发表于:2013/4/9 21:20:54
#2楼
VC++6.0 还没有淘汰吗?
不积硅步,无以至千里;不积小流,无以成江河;九层之台,始于垒土。   好好学习,天天向
上。
734
kentehong
文章数:81
年度积分:50
历史总积分:734
注册时间:2013/1/13
发站内信
发表于:2013/4/10 12:10:02
#3楼
这个估计用的不多吧。不过还是支持LZ。表情
1480
竹叶三
文章数:147
年度积分:50
历史总积分:1480
注册时间:2009/5/18
发站内信
发表于:2013/4/10 12:45:16
#4楼
好贴得顶一下。最近开始研究VC++.
天道终酬勤!
4030
sankyo_feng
文章数:730
年度积分:56
历史总积分:4030
注册时间:2006/11/8
发站内信
发表于:2013/4/11 7:52:58
#5楼
跟帖,占位
17528
ahljj
文章数:3386
年度积分:240
历史总积分:17528
注册时间:2002/3/23
发站内信
发表于:2013/10/20 19:58:58
#6楼
学习了
1050
HaveGood
文章数:-11
年度积分:-729
历史总积分:1050
注册时间:2006/9/18
发站内信
发表于:2017/5/7 22:41:50
#7楼
此楼内容不符合板块规定,不予显示! 查看原帖内容>>

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

93.6006