vc++上位机程序
- 格式:doc
- 大小:1.04 MB
- 文档页数:20
利用VC++6.0实现上位机与PLC的串行通信作者:惠鸿忠, Hui Hongzhong作者单位:聊城大学刊名:微计算机信息英文刊名:CONTROL & AUTOMATION年,卷(期):2006,22(16)被引用次数:12次参考文献(4条)1.郭飒基于OPENGL的灯光控制系统的实现[期刊论文]-微计算机信息 2004(05)2.苗长新注浆泄漏监测程序的设计及其串行通信实现[期刊论文]-微计算机信息 2003(06)3.李现勇Visual C++串口通信技术与工程实践 20024.SIMATIC S7-200可变程序控制器系统手册引证文献(12条)1.吴镇平基于PLC的桥式组合大切机监控系统设计[期刊论文]-闽西职业技术学院学报 2010(1)2.徐洋.王宏华.周强.李俊星基于MSP430单片机的无刷直流电机实验测试平台设计[期刊论文]-机械制造与自动化2010(4)3.杨英琴.侯力.郑熙.王裕林.陈丹PLC控制系统在厚壁钢管超声波探伤中的应用[期刊论文]-机械设计与制造2010(12)4.吴镇平.林海涨.李捷辉利用VC++6.0实现PLC实时监控[期刊论文]-装备制造技术 2009(7)5.王少江.侯力.薄立朗.匡红PLC和变频器在超声波自动探伤系统的应用[期刊论文]-煤矿机械 2009(4)6.唐捷.蔡智圣.李争名.赵士滨基于PC机并口通信的多媒体设备控制系统的设计与实现[期刊论文]-光盘技术2009(2)7.李波.舒朝君.江彦.余磊.刘永喜.胡玉庆.皮智敏基于VC的PLC数据采集管理系统[期刊论文]-现代电子技术2009(6)8.董奎勇.钱炜.王明军.熊磊基于VC++的月球车的数据采集处理系统[期刊论文]-微计算机信息 2008(28)9.黄良希.LI Ding-zhu用于机动车路考系统的车载通讯系统研究[期刊论文]-微计算机信息 2008(23)10.汤光华.吴青自由口模式下S7200 PLC与上位机的通信[期刊论文]-微计算机信息 2008(13)11.李志伟基于AT指令的串行通信程序的设计[期刊论文]-微计算机信息 2007(9)12.安宪军.黄尔烈.贾少锐.张常全基于Delphi7.0的上位机与PLC的通信[期刊论文]-微计算机信息 2007(7)本文链接:/Periodical_wjsjxx200616021.aspx。
基于C#的串口通信上位机和下位机源程序基于单片机串口通信的上位机和下位机实践串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus 或者USB混淆)。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
首先亮出C#的源程序吧。
主要界面:只是作为简单的运用,可以扩展的。
源代码:using System;using System.Collections.Generic;using System.ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO.Ports;using System.Timers;namespace 单片机功能控制{public partial class Form1 : Form{public Form1(){Initializeponent();}SerialPort sp = new SerialPort();private void button1_Click(object sender, EventArgs e) {String str1 = boBox1.Text;//串口号String str2 = boBox2.Text;//波特率String str3 = boBox3.Text;//校验位String str4 = boBox5.Text;//停止位String str5 = boBox4.Text;//数据位Int32 int2 = Convert.ToInt32(str2);//将字符串转为整型Int32 int5 = Convert.ToInt32(str5);//将字符串转为整型groupBox3.Enabled = true;//LED控制界面变可选try{if (button1.Text == "打开串口"){if (str1 == null){MessageBox.Show("请先选择串口!", "Error"); return;}sp.Close();sp = new SerialPort();sp.PortName = boBox1.Text;//串口编号sp.BaudRate = int2;//波特率switch (str4)//停止位{case "1":sp.StopBits = StopBits.One;break;case "1.5":sp.StopBits = StopBits.OnePointFive;break;case "2":sp.StopBits = StopBits.Two;break;default:MessageBox.Show("Error:参数不正确", "Error"); break;}switch (str3){case "NONE":sp.Parity = Parity.None; break;case "ODD":sp.Parity = Parity.Odd; break;case "EVEN":sp.Parity = Parity.Even; break;default:MessageBox.Show("Error:参数不正确", "Error"); break;}sp.DataBits = int5;//数据位sp.Parity = Parity.Even;//设置串口属性sp.Open();//打开串口button1.Text = "关闭串口";textBox1.Text = Convert.T oString(sp.PortName) + "已开启!"; }else{sp.Close();button1.Text = "打开串口";groupBox3.Enabled = false;//LED控制界面变灰色textBox1.Text = Convert.T oString(sp.PortName) + "已关闭!"; }}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void Form1_Load(object sender, EventArgs e){//初始化textBox1.Text = "欢迎使用简易的串口助手!";groupBox3.Enabled = false;//LED控制界面变灰色groupBox6.Enabled = false;groupBox7.Enabled = false;groupBox8.Enabled = false;button3.Enabled = false;button6.Enabled = false;timer1.Start();try{foreach (string in System.IO.Ports.SerialPort.GetPortNames()) //自动获取串行口名称this.boBox1.Items.Add();//默认设置boBox1.SelectedIndex = 0;//选择第一个口boBox2.SelectedIndex = 4;//波特率4800boBox3.SelectedIndex = 0;//校验位NONEboBox4.SelectedIndex = 0;//停止位为1boBox5.SelectedIndex = 0;//数据位为8}catch{MessageBox.Show("找不到通讯端口!", "串口调试助手");}}private void timer1_Tick(object sender, EventArgs e){label6.Text = DateTime.Now.T oString();}private void button2_Click(object sender, EventArgs e){try {if (button2.Text == "开启"){groupBox6.Enabled = true;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;button3.Enabled = true;textBox2.Text = String.Empty;button2.Text = "关闭";}else{groupBox6.Enabled = false;button3.Enabled = false;button2.Text = "开启";textBox2.Text = String.Empty;}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void button3_Click(object sender, EventArgs e) {groupBox6.Enabled = true;label7.Text = "已发送";if (textBox2.Text == "")MessageBox.Show("发送失败,请选择发送的数据!");elsesp.WriteLine(textBox2.Text);//往串口写数据}private void checkBox1_CheckedChanged(object sender, EventArgs e){try {if (checkBox1.Checked){checkBox1.Checked = true;checkBox2.Checked = false;checkBox3.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;label7.Text = "准备发送";textBox2.Text = "1";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox2_CheckedChanged(object sender, EventArgs e) {try {if (checkBox2.Checked){checkBox1.Checked = false;checkBox2.Checked = true;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;label7.Text = "准备发送";textBox2.Text = "2";radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox3_CheckedChanged(object sender, EventArgs e) {try{if (checkBox3.Checked){checkBox1.Checked = false;checkBox3.Checked = true;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "3";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox4_CheckedChanged(object sender, EventArgs e) {try{if (checkBox4.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "4";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox5_CheckedChanged(object sender, EventArgs e) {try{if (checkBox5.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = true;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "5";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox6_CheckedChanged(object sender, EventArgs e){try{if (checkBox6.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = true;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "6";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox7_CheckedChanged(object sender, EventArgs e){try{if (checkBox7.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = true;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "7";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox8_CheckedChanged(object sender, EventArgs e) {try{if (checkBox8.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = true;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "8";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void button5_Click(object sender, EventArgs e) { try{if (button5.Text == "开启"){radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;groupBox7.Enabled = true;button6.Enabled = true;textBox2.Text = String.Empty;button5.Text = "关闭";}else{groupBox7.Enabled = false;button6.Enabled = false;button5.Text = "开启";textBox2.Text = String.Empty;}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void button6_Click(object sender, EventArgs e) {label7.Text = "已发送";if (textBox2.Text == "")MessageBox.Show("发送失败。
VC版07规约国网多功能表上位机软件操作说明把文件夹解压后,即可运行“07规约上位机-VC版”文件夹下的文件“gw2007test.exe”进入软件主界面。
抄表1.点击左上角菜单栏“配置”项,选择正确串口、波特率、偶校验E、数据位8、停止位1、密码权限、密码,点击“确认退出”。
在右上角“表地址”栏输入正确的表地址,一般为局编号的带数字部分。
(AAAAAAAAAAAA为广播地址可以作为万能表号使用)2.点击左上角菜单栏“抄读”项,进入抄读窗口界面,在左侧定制抄表方案(在需要抄读数据前打√),在展开的图中可以看到各个大类的内容,选择自己的需要部分打√,全部选择完毕后在方案中输入一个名称,点击“方案保存”,然后“方案读取”。
3.点击菜单栏“单抄”按钮,即可将方案内容数据全部读出。
(如需保存可点击右上方“数据保存”即可)。
4.点击“抄读数据保存”后,抄表完毕软件会自动把数据保存在该软件目录下的.MDB 文件中。
打开该数据库可以导出数据为EXCEL实现打印。
5.抄读“负荷曲线”:点击菜单栏“曲线”按钮,按需要选择不同方式读取数据,点击“曲线数据保存”即可完成保存,可以导出为EXCEL格式实现打印。
一、设表参数设置正确输入表的实际地址(地址不支持AAAAAAAAAAAA)。
在菜单栏点击“设置”按钮,根据规约要求正确设置需要更改的项,在“数据域”修改数据后,选取“设置”表示该项目需要设置,在“方案名”中输入方案名称,点击“方案保存”后“方案读取”,点击菜单栏“单设”后,观察栏目后设置“结果”。
设置成功的在该项目后面结果栏出现“OK”,否则不成功则出现“ERROR”。
命令类点击菜单栏“命令类”可以进行以下操作1.“读通信地址”可以读取表地址2.“写通信地址”输入新的表地址,按“发送”即可对表地址进行更改3“广播校时”每日一次,5分钟以内4“冻结命令”根据需要进行冻结5.“更改通信速度”选择好合适的波特率,点击“发送”即可6.“修改密码”输入原始密码和权限、及需要修改的新密码和权限,点击“发送”即可。
1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest;2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。
选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。
(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX 一项选上,重新安装VC6,选上ActiveX就可以了),这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
3.利用ClassWizard定义CMSComm类控制对象打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES() #i nclude "mscomm.h"//}}AFX_INCLUDES 。
4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。
第10章 上位机程序开发在USB设备开发中,上位机程序是用于与用户进行接口的。
上位机程序通过USB设备驱动程序和外部的USB硬件进行通信,USB固件程序执行所用的硬件操作。
一般来说,根据选择开发平台的不同,可以使用Visual C++、Visual C#和LabVIEW等开发上位机程序。
本章首先介绍了Visual C++中控制USB设备的相关函数,接着介绍了Visual C#中读写USB设备的主意函数,最后介绍了在LabVIEW中如何读写USB设备。
本章内容包括:Visual C++读写USB设备;Visual C#读写USB设备;LabVIEW读写USB设备。
10.1 Visual C++读写USB设备在USB设备开发过程中,上位机程序可以采用广泛应用的Visual C++来实现。
对于Cypress公司的EZ-USB系列芯片,其提供了全面的CY3684开发包。
在该开发包中,可以使用CYIOCTL控制函数类和CyAPI控制函数类来实现Visual C++环境下对USB设备的读写。
10.1.1 CYIOCTL控制函数类CYIOCTL控制函数类为Cypress公司的EZ-USB FX2LP系列USB接口芯片,提供了简单的控制接口。
在使用Cypress公司提供的驱动程序基础上,只需在主机Visual C++程序中加入头文件cyioctl.h,然后便可以调用相应的控制函数。
为了能够使用这些函数,主机程序必须首先获得USB设备的控制句柄。
可以通过以下的代码在程序中获得连接到主机的USB设备句柄。
CCyUSBDevice *USBDevice = new CCyUSBDevice(); //USB设备HANDLE hDevice = USBDevice->DeviceHandle(); //打开设备句柄其中,hDevice即为获得的USB设备句柄。
在退出程序的时候,需要释放该USB设备句柄,使用如下的语句即可:delete USBDevice;在主程序获得USB设备的控制句柄后,便可以调用CYIOCTL控制函数类提供的接口控制函数,下面分别进行介绍。
要:本文介绍了用VC++和MFC开发的上位机和PLC的通讯系统,给出了系统的通讯原理和系统的软件设计方法。
实践证明整个系统运行稳定,实用性和可扩展性强。
关键词:PLC;VC++;MFC;通讯模式1 概述PLC(Programmable Logic Controller)作为新一代工业控制器,以其高性能价格比在工业测控系统中获得了广泛应用。
随着微电子及控制技术的不断发展,PLC已逐渐成为一种智能型、综合型控制器,由PLC 构成的集散控制是现代工业控制的一个重要组成部分。
在众多的小型集散控制系统中,若使用专业工控组态软件,如INTOUCH、FIX等,制作上位机的监控界面,而以专用的PLC通信接口模块以及其厂家推荐的DDE Server作为联系上位机和PLC的桥梁,则成本较高、投资较大。
所以上位机直接与PLC的通讯是一种很好的技术方案。
在Windows环境下开发与工业PLC通讯,可以利用C并借助Windows SDK提供的应用程序接口函数来完成软件的设计,但这样开发的程序很复杂;也可以利用Visual Basic提供的通讯控件来开发串行通讯程序,程序的编制十分简单,但在现实中,许多大的应用系统都是基于VC++平台开发的,VC++是现今最复杂、但也是最强大的一种Windows应用程序开发工程软件。
它在图形处理和数据库管理等方面具有较强的优势,并且用它来实现底层的通讯控制有着更快的效率,使用MFC设计的界面与Visual Basic设计的界面一样简练。
因此我们利用VC++6.0提供的通讯控件MSComm,以MFC来设计界面编制程序,构造与PLC的通讯系统。
系统中的PLC为西门子公司的S7-200系列CPU226型。
2 系统的通讯原理西门子S7-226型PLC是一种模块化结构的小型PLC,具有较高的性能价格比,它带有两个RS485通讯口,而上位机即工控机的串行口是RS232,所以采用西门子公司专用的PC/PPI编程电缆作为上下位机的连接电缆,它实现了RS232和RS485的转换,并且具有隔离抗干扰功能。
VC++串口上位机简单例程(源码及详细步骤)VC++编写简单串口上位机程序串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。
编译环境:VC++6.0操作系统:VMWare虚拟出来的Windows XP程序实现功能:1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。
PC的COM口编号可以通过如下方式修改:当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。
COM1口可用的话,会提示串口初始化完毕。
否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。
2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC 转换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。
(见文章末尾图)3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。
程序的编写:1、打开VC++6.0建立基于对话框的MFC应用程序Test,2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control, version 6.0->Insert,按默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。
万方数据 万方数据24)。
RcvTBL。
PORT激活初始化或结束接收信息的服务。
通过指定端口(PORT)接收的信息存储于数据缓冲区(TBL)。
RcV缓冲区的格式如图2所示。
数据缓冲区的第一个数据指明了接收的字节数。
下面是部分程序,//端口初始化图2Rcv缓冲区格式MOVB16#09.SMBl30/,选定串口l,初始化自由口,选择9600波特率,8位数据位,无校验MOvB16#B0,SMBl87,/初始化Rcv信息控制信息MOVB42,sMBl89溅信息结束信息为42(…)MOVB10,sMBl94,,没定最大字符数为10ATcHINT_l,24/,接收完成事件接到中断lENI//允许用户中断RcvvBlOO,1//端口1的接收信箱缓冲区指向vBl00臌£理接收数据的中断程序lLDSMO.OMOVW+O.VW200MOVW+O.VW202BTIvBl03,vw202胛B103为高6位数字量MOVW+64.VW200}IVW202.VW200B.ⅡvBl04,vw202脚B104为低6位数字量+IVW202.VW200M0vwvw200,vwl00,/结果存vwloo单元CRErI’I,,中断返回4结论本文利用vc++6.0开发了的串口通讯程序。
充分利用了PLc和上位机本身资源的优势实现二者的通信。
上述方法和程序已经成功地应用于某冶炼厂的锌精馏过程锌液流量计算机控制系统中,实际运行情况表明,这种通信方法简单、稳定、可靠,到达了预期的效果。
参考文献[1]Joecampbeu.串行通信c程序员指南[M】.北京:清华大学社出版社.1995.f2]樊昌信等.通信原理p川.北京:国防工业出版社,1995.【3】王华,叶爱亮,祁立学,曹凌云.Ⅵsualc++6.o编程实例与技巧[M].北京:机械工业出版社,1999.第一作者简介:李建军,男,1968年生,衡阳人,工学硕士,副教授。
研究领域:电力电子、电子测量、高等教育病理学。
VC++MSComm串口发送与接收上位机本设计用VC编写的一个简单的上位机软件,实现功能为:简单的串口数据发送与接收。
具体步骤如下:一.建立应用程序工程“串口通信_韩季方01”1.打开VC++6.0-》建立对话框MFC应用程序:串口通信_韩季方01—》添加基本控件如图1。
0.图1。
02.添加MSComm控件:Add To Project—》Components and Controls…打开如图1.1,双击“Registered ActiveX Contronls”项—》出现如图1.2—》选择“Microsoft Communications Control,version 6。
0"控件—》点击“Insert”—》提示“…”确认即可-》弹出图1.3—》点击“OK”—》再点击“Close”。
下一步,将对话框资源控件中的电话状控件托到对话框中即可,如图1.4。
图1。
1 图1。
2图1.3图1.4 3。
编辑控件及其属性设置:如表1。
0控件控件ID Caption 需要添加的变量及变量类型静态文本IDC_STATIC 接收显示静态文本IDC_STATIC 发送输入编辑框IDC_EDIT_RXDATA m_strEditRXDataValue CString编辑框IDC_EDIT_TXDATA m_strEditTXDataValue CString 按键IDC_BUTTON_MANUALSEND 发送IDC_MSCOMM1 m_ctrlcomm control MSComm控件表1.04。
添加变量及其类型方法如图1.5图1.5二.初始化串口:设置MSComm控件属性打开Class Wizard—》Member Variables-》选IDC_MSCOMM1-》点击“Add Varialbe…"—》添加变量m_ctrlComm。
如图1。
5。
之后,在工作空间打开文件如图2。
0—》在函数OnInitDialog中添加代码如图2.1.图2.0图2。
STM32开发--VisualStudioC++编写串⼝上位机
打算使⽤Visual Studio编写⼀个串⼝上位机程序,然后进⾏测试。
原来的上位机各种BUG,受不了了。
⾃⼰写⼀个得了。
⼀、创建 MFC ⼯程
选择MFC应⽤:
应⽤程序类型选择 基于对话框:
⽣成效果:
⼆、设置控件
找到“⼯具箱”,就可以将相应的控件拖拽⾄应⽤程序对话框中
常⽤控件有: Button, Edit Control, Static Text,Group Box,Combo Box等。
最后简单的上位机界⾯如下:
三、⽰例
花了两天时间,做了个半成品。
发送数据,没能输⼊。
接收数据,没有滑轮可以上下滑动。
是否选择⼗六进制没有、保存窗⼝没有。
没时间懒得弄了,之后⼜需要再做开发。
⽰例下载:
参看:
参看:。
摘要本论文设计是基于VisualC++6.0软件下实现双油缸同步控制系统的编程,探索同步控制的控制策略,并且完成高精度双油缸同步控制实验。
该系统控制界面不仅简洁实用,而且具有良好的人机交流功能。
上位机控制系统所实现的功能有双油缸的通讯、UP、暂停、DOWN、停机、位移显示、曲线显示等,在完成同步控制程序后探究反馈控制策略并编写程序,实现双油缸同步控制。
在接口程序编程部分,本文采用EDC220控制器提供的接口函数实现PC机与控制器通讯,数据的发送与接收采用统一通讯协议,这种方法不仅简单,而且实用。
本文采用控制器作为下位机来验证上位机控制功能,控制器作为下位机主要负责两个油缸的各种参数数据的采集,然后通过端口把数据发送给上位机,PC机作为上位机主要负责数据的分析处理和显示。
本文最后完成高精度双油缸同步控制实验,验证同步控制精度。
关键词:双油缸,VC++,EDC220控制器,反馈,同步控制ABSTRACTThis d esign's core is und er the software of Visual C++6.0, realizes the d oubl e hydraulic cylind er synchronous control system programming, expl ores control strategy of EDC220 controll er, and completes experiment for high-precision d oubl e hydraulic cylind er synchronous control. This control interface has not only succinct practical, but also has the good man-machine exchange part.The superior machine system realizes the function has the d oubl e hydraulic cylind er's Communication, Up, Pause, Down, Stop, Displacement d emonstration, Curve d emonstration and so on. After compl eting synchronous control program, expl oreing the feedback control strategy and programming, and Achieve d oubl e hydraulic cylind er synchronization control. Interface programming part, EDC220 provid es the use of interface functions to achieve PC-controll er communication, the data transmission and the receive uses the unified communication protocol, this method is not only simpl e, but practical. In this article uses the EDC220 controll er to confirm the superior machine control function as the l ower position machine realization, the EDC220 controll er as l ower position machine primary cognizance d oubl e hydraulic cylind er 's each kind of parameter data gathering. Then through the port the data transmission for the superior machine, PC machine takes the superior machine primary cognizance data the analysis processing and the d emonstration. Finally, compl eted high-precision the d oubl e hydraulic cylind er synchronous control experiment, to verify the accuracy of synchronization control.Key words:Doubl e hydraulic cylind er, VC++; EDC220 controll er, feedback, synchronous control目录摘要 (I)ABSTRACT .......................................................................................................................................................... I I 绪论 (3)1 同步控制策略 (5)1.1 EDC220控制器 (5)1.1.1 同步化模块 (6)1.1.2 同步系统命令 (7)1.1.3 同步数据处理 (8)1.2 MFC类库 (9)1.3反馈控制 (10)2 GUI设计 (12)2.1 主界面 (12)2.2 绘图窗口 (13)2.3 界面优化 (17)3 接口通讯 (19)3.1 PC机与下位机通信方式 (19)3.2 VC实现接口通讯方法 (19)4 控制系统程序编写 (22)4.1 主要接口程序 (22)4.1.1 接口编程 (22)4.1.2 通讯连接 (23)4.1.3 同步控制 (24)4.1.4 数据采集 (25)4.2 定时器模块 (26)4.3 定点状态显示 (27)4.4 反馈控制 (28)4.5 数据处理 (30)4.5.1 实时曲线绘制 (30)4.5.2 数据显示与保存 (31)5 验证实验 (33)5.1 实验设备 (33)5.2 实验过程 (33)5.2.1 接口程序数据传输实验 (34)5.2.2 连接设备进行通讯实验 (34)5.2.3 单个油缸运动控制实验 (34)5.2.4 两个油缸同步控制实验 (36)5.3 实验结论 (36)结论 (39)参考文献 (40)附录A:程序 (42)致谢 (71)绪论高精度双油缸同步控制可应用于很多工业与科研领域,它也是力学真三轴试验的基础。
基于VC的多功能电力仪表上位机管理软件作者:任玉茂胡炜薇秦会斌来源:《无线互联科技》2013年第10期摘要:为实现多功能电力仪表各项数据的实时检测,方便用户在一台主机上对多个下位机进行查看和管理,现开发出一款上位机管理软件。
该软件基于MFC平台,利用MSCOMM 通信控件,通过485总线与单片机进行通信。
软件将采集到的数据处理整合,在一个界面上同时显示电压、电流、功率、电能等多项数据,数据自动刷新。
不同的下位机可选择显示,下位机的信号网络、电压变比、电流变比等参数可手动更改,软件同时还集成了电能值一键清零的功能。
该软件使用简便,传送数据快速准确,现已投入市场运用。
关键词:多功能电力仪表;上位机;MSCOMM控件;参数设置;电能清零随着科学技术的发展,对单一现场数据的采集与显示已不能满足人们的需求,特别是当网络结点变多的时候,逐个对每个结点进行单一管理显得十分困难,因此,数据的集中采集和智能管理已成为现代控制领域必然的发展方向。
现代化集中管理需要对现场数据进行统计、分析、制表、打印、绘图等,同时,又要求对现场装置进行实时控制,完成各种规定操作,达到集中管理的目的。
加之单片机的计算能力有限,难以进行复杂的数据处理。
因此在功能比较复杂的控制系统中,通常以PC机为上位机,单片机为下位机,由单片机完成数据的采集及对装置的控制,而由上位机完成各种复杂的数据处理及对单片机的控制。
1 整体设计方案本系统涉及上位机和下位机之间的通信,因此系统共包含三个部分:下位机—ATmega32单片机、总线和协议—485总线和Modbus通讯协议、上位机—MFC应用程序。
系统设计框图如下:2 下位机简介下位机是ATmega32单片机,单片机接收上位机发来的指令,并根据要求向上位机传送数据或者更改参数设置。
下位机设备有独立的通信模块,通过B0505与外部电路隔离,通信模块留有RXD、TXD、A、B四个接口,RXD、TXD与单片机串行口连接,A、B与485总线连接,中间是独立的转换电路。
VC++上位机串口通信设计小结:1 新建一基于单对话框的MFC文件2 对对话框添加一串口通信控件(像一电话形状,没有的话需要自己添加)3 设置串口通信控件属性(主要包括通信端口和波特率)4 为串口通信控件添加变量m_ctrlComm5 对对话框添加按钮并添加相应函数(可添加一个或多个按钮,响应函数类似,做少许修改即可)char i= '1';CString str;str.Format("%c",i);m_ctrlComm.SetOutput(COleV ariant(str));6 切换到CLASS VIEW 窗口,找到on initdialog 类对其添加相应函数//调整字体CFont * f;f = new CFont;f->CreateFont(15, // nHeight 设置字的大小5, // nWidth 调整显示长度0, // nEscapement0, // nOrientationFW_BOLD, // nWeightFALSE, // bItalicFALSE, // bUnderline0, // cStrikeOutANSI_CHARSET, // nCharSetOUT_DEFAULT_PRECIS, // nOutPrecisionCLIP_DEFAULT_PRECIS, // nClipPrecisionDEFAULT_QUALITY, // nQualityDEFAULT_PITCH | FF_SWISS, // nPitchAndFamily_T("Arial")); // lpszFacGetDlgItem(IDC_STA TIC1)->SetFont(f); //IDC_STA TIC1是静态文本框的ID以上添加的是改变对话框标题,静态文本中汉字字体的函数,特别注意静态文本的ID为IDC_STA TIC1。
基于VB的上位机程序设计,用来实时监测温度变化用来连接Arduino的传感器很多,但是都没办法直观观测传感器数据值,本文设计的是一个简单的温度检测系统,上位机程序用来检测和显示Arduino串口发送的温度数据,并通过曲线的形式描绘出温度的变化过程。
上位机程序采用VB6.0设计。
上位机程序两次接收的温度数据间隔控制在1秒钟,能够显示的温度曲线的总时间在3分钟左右。
一、VB介绍VB是Visual Basic的简称,是美国微软公司于1991年开发的一种可视化的、面向对象和采用事件驱动方式的结构化高级程序设计语言,类似于浏览器中JAVAScript操作HTML一样、安卓APP开发等。
可用于开发Windows 环境下的各类应用程序。
今天我们以VB6.0为基础,简单的认识一下VB。
二、VB基本操作安装Visual Basic成功之后,安装程序自动在【开始】菜单中建立Visual Basic 6.0的程序组和程序项。
点击启动,在VB启动后,屏幕上将出现如图2-1所示的启动界面,在启动界面中会出现一个【新建工程】对话框。
图2-1 启动界面2.1、创建工程在VB启动界面中的【新建工程】对话框中选择一个合适的工程类型,然后单击【打开】按钮,就可以新建一个工程,新工程打开后的用户界面如图2-2所示。
图2-2 用户界面2.2、控件设置和控件属性设置在用户界面的左侧是VB的【工具箱】,在【工具箱】中有我们常用的各类控件,在设计窗体时我们可以直接从工具箱中选择控件,然后在中间的【对象窗口】中按住鼠标左键拖出一个矩形后,相应的控件就放置到了用户的编辑窗口中,对于控件的各个属性,我们可以通过VB界面右面的【属性窗口】设置各个控件的各种属性,放置并调整好控件的各个属性的,如图2-3所示。
图2-3 添加控件后的对象窗口2.3、添加代码双击【对象窗口】的空白处或者某个控件,就会出现【代码窗口】,如图2-4所示。
图2-4 代码窗口在代码窗口中为各个事件添加相应的代码,在程序运行的时候一旦某个事件发生,就会执行相应的代码段,这里以Form_Load()事件为例,简单的设计一个实例程序。
VC++编写简单串口上位机程序2010年4月13日10:23:40串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C 语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。
编译环境:VC++6.0操作系统:VMWare虚拟出来的Windows XP程序实现功能:1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。
PC的COM口编号可以通过如下方式修改:当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。
COM1口可用的话,会提示串口初始化完毕。
否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。
2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC转换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。
(见文章末尾图)3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。
程序的编写:1、打开VC++6.0建立基于对话框的MFC应用程序Test,2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control, version 6.0->Insert,按默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。
3、删除确认、取消和提示框,添加“电话”、进程、静态文本、按钮、编辑框,拖动添加的控件,根据喜好布局。
4、右击编辑框Edit选择属性,在样式里设置,勾选多行、垂直滚动,其它可按默认值。
右击静态文本Text选择属性,在常规设置里,修改标题。
右击按钮PushButton选择属性,在在常规设置里,修改标题。
修改后界面如下,程序写出来运行时“电话”标志会自动消失。
5、查看->建立类向导MFC ClassWizard->Member Viariable,选择ClassName为CTestDlg的类,Control ID为MSCOMM1,双击它,为它添加控制变量m_comm1。
类似的,选择IDC_BUTTON2添加控制变量m_serial。
(建立类向导也可以右击然后在弹出的快捷菜单里选择建立类向导)至此,基本框架已经出来了,编译后运行可以看到如下所示的界面。
(组建->全部组件,然后组建->执行)6、点击左侧的视图窗口,可以在三种模式下切换,第三个是打开我们的源代码窗口,第一个是类,第二个是窗体的资源视图。
选择File View,展开test files->Header Files,打开testDlg.h,在全局变量下添加如下代码,然后保存:int gllen;//定义整型标量gllen,用于记录接收数据的个数CProgressCtrl * pbar; //指向进度条的指针,用于操作进度条CString strRXDdata; //编辑框显示的文本,记录历次转换值7、点击Recourse View,展开test recourses->Dialog,双击IDD_TEST_DIALOG,编辑我们的主界面对话框。
双击击“电话”,弹出如下对话框,按确认键:VC会进入源码编辑窗口,这个函数是用来处理串口事件的,当PC串口接收到数据时,会产生一个数据缓冲区有数据的消息事件,然后调用执行这个函数。
添加如下代码,进行数据处理,窗口更新等操作:V ARIANT variant1;//定义V ARIANT型变量,用于存放接收到的数据COleSafeArray safearray;//定义safearray型变量LONG len,k;//定义长整型变量len,kBYTE rxdata[2048];//定义BYTE型数组CString stremp1,stremp2;//定义两个字符串if(m_comm1.GetCommEvent()==2) //判断引起OnComm时间的原因{//如果是接收到特定个字节数,则读取接收到的数据variant1 = m_comm1.GetInput();//把接收到的数据存放到V ARIANT型变量里safearray = variant1;//V ARIANT型变量转换为ColeSafeArray型变量len = safearray.GetOneDimSize();for(k=0;k<LEN;K++){safearray.GetElement(&k,rxdata+k); //得到接接收到的数据放到BYTE型数组rxdata里}for(k=0;k<LEN;K++){BYTE bt = (*(unsigned char*)(rxdata+k)); //读取AD转换的高字节if((k%2)==0)if((k+1)<LEN){gllen++;//全局的变量,对接收到的转换结果的个数进行计算stremp2.Format("第%d次转换结果:",gllen);//显示第几次转换int temp = bt*4+((*(unsigned char *)(rxdata+k+1))>>6); //高低字节合并成实际的转换结果,注意转换结果是左对齐stremp1.Format("%2.2f",(2.56*temp/1024));//计算成实际电压值SetDlgItemText(IDC_STATIC,("当前电压值为:"+stremp1+" V")); //更新静态文本控件pbar -> SetPos(temp);//更新进度条的当前位置strRXDdata += stremp2;//把新的数据放到全局的字符串里strRXDdata += stremp1;strRXDdata += " V\r\n";//字符串加单位V后换行}}}SetDlgItemText(IDC_EDIT1,strRXDdata);//更新文本控件的显示这时重新编译一下,看会不会有什么错误,出现下面提示,可以选择全部组建来清除。
LINK : LNK4073: cannot create map for .ILK file; linking nonincrementally出现下面错误,请关闭运行的test.exe后重试。
LINK : fatal error LNK1104: cannot open file "Debug/test.exe"出现下面错误两种错误,是由于空间编号问题引起的,当我们添加了编辑框或者“电话”后再添加,其编号自动加一,就会出现控件没定义。
Z:\vc++串口上位机\test\testDlg.cpp(32) : error C2065: 'IDC_MSCOMM1' : undeclared identifierZ:\vc++串口上位机\test\testDlg.cpp(139) : error C2065: 'IDC_EDIT1' : undeclared identifier解决方法是,在RecourseView里,打开窗体IDD_TEST_DIALOG,右击“电话”或者编辑框等其它出错的控件,右击选择属性,在常规里修改ID,这里的程序,除BUTTON有1、2两个之外,其它都是1全部组建编译一下,看看有没有错误,没有错误就可以运行一下,可以看到界面更原来是一样的。
有错误就修改一下,省得弄多了,错在哪里都不知道,查起来麻烦。
8、在源码编辑里,打开testDlg.cpp文件,进行窗口初始化函数的编写。
找到BOOL CTestDlg::OnInitDialog()函数,在SetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization here后面添加如下初始化代码:gllen = 0; //记录转换次数全局变量清零if(! m_comm1.GetPortOpen())//判断串口是否已经打开{m_comm1.SetCommPort(1); //选择串口号1m_comm1.SetPortOpen(TRUE); //打开串口m_comm1.SetRThreshold(2); //收到两个字节引发OnComm事件m_comm1.SetInputMode(1);//输入模式选为二进制m_comm1.SetSettings("57600,n,8,1"); //设置串口参数,波特率57600,无奇偶校验,1位停止位,8位数据位MessageBox("串口初始化完毕","提示"); //提示串口成功初始化}else MessageBox("串口被占用","提示"); //如果已经打开串口,消息框提醒pbar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);//获得指向IDC_PROGRESS1的指针pbar -> SetRange(0,1023);//设置进度条的范围0~1023pbar -> SetPos(0);//当前位置为0m_serial.SetWindowText("关闭串口");//按钮显示状态改变可以看到,串口的参数等等都在在这里初始化的,可以根据自己的需要修改的,具体可以查看VC++里的详细介绍,看看有哪些参数可以给我们修改来用。
添加后再编译一下,运行后可以看到多了一个串口初始化的提示信息窗口。
至此,我们已经完成了主要的串口操作及界面,剩下的就是两个按钮的操作了。
9、回到资源视图的IDD_TEST_DIALOG窗口,双击开始转换按钮,给它添加事件,点击后PC通过串口发送0xaa出来,给单片机接收。
添加如下代码:CByteArray m_Array; //定义字节数组m_Array.RemoveAll(); //字节数组清空m_Array.SetSize(1); //设定维数为1m_Array.SetAt(0,0xaa); //给m_array[0]赋值0m_comm1.SetOutput(COleVariant(m_Array));//由于SetOutput函数的参数为V ARIANT型,必须强制转换后才能发送同样地,双击另外一个按钮,给串口操作按钮添加代码,用于关闭或者打开串口。