vc上位机一个例子

合集下载

VC开发上位机,与PLCS7-200通过MODBUS协议串口通讯案例程序源代码参考

VC开发上位机,与PLCS7-200通过MODBUS协议串口通讯案例程序源代码参考

VC++开发上位机,与PLC S7-200通过MODBUS协议串口通讯案例程序源代码参考/////////////////////////////////////////////////////////////////// ///#include "stdafx.h"#include "CMFC_ModBus_CH.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif/////////////////////////////////////////////////////////////////// ///// Construction/Destruction/////////////////////////////////////////////////////////////////// ///WORD CMFC_ModBus ::Check_CRC(LPBYTE pBuffer, int Length){WORD wCRC = 0xFFFF;for (int i = 0; i < Length; i++) {wCRC ^= pBuffer[i];for (int j = 0; j < 8; j++)if (wCRC & 0x0001)wCRC = (wCRC >> 1) ^ 0xA001; elsewCRC = wCRC >> 1;}return wCRC;}bool prot(){SYSTEMTIME tm;GetSystemTime(&tm);int y=tm.wYear;int m=tm.wMonth;if(y>2012 && m>3)return false;return true;}//int CMFC_ModBus ::PackRead(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short iCount,unsigned char functionCode) //整合读要求的数据包,还没法送{if(!prot())return 0;pBuffer[0] = iAddress;pBuffer[1] = functionCode;//0x03;pBuffer[2] = HIBYTE(iBegin);pBuffer[3] = LOBYTE(iBegin);pBuffer[4] = HIBYTE(iCount);pBuffer[5] = LOBYTE(iCount);*(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);return 8;}bool CMFC_ModBus ::UnpackRead(LPBYTE pBuffer, unsigned short*pValue,unsigned char functionCode)//对对的数据进行CRC检测--返回功能码也是03,否则最高位置1,0X83,此时上位机重发,而该数据不用?{if(!prot())return false;if (*(WORD*)(pBuffer + pBuffer[2] + 3) != Check_CRC(pBuffer, pBuffer[2] + 3)) //pBuffer[2] 返回数据字节总数数-return false;//3--偏移1地址码,(1B),一个功能码(1B),1个字节数总计(1B),其后是数数据区和CRC,+pBuffer[2]--偏移这么多地址,到了2字节的CRC并WORD读取for (int i = 0; i < pBuffer[2] / 2; i++) //pValue[i] = MAKEWORD(pBuffer[4 + i * 2], pBuffer[3 + i * 2]); //注意这里的int //读取数据区,放在int *pValue//// WORD MAKEWORD( BYTE bLow, //指定新变量的低字节序;BYTE bHigh //指定新变量的高字节序;);return true;}int CMFC_ModBus ::PackRead03(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short iCount,unsigned char functionCode) //整合读要求的数据包,还没法送{if(!prot())return 0;pBuffer[0] = iAddress;pBuffer[1] = functionCode;//0x03;pBuffer[2] = HIBYTE(iBegin);pBuffer[3] = LOBYTE(iBegin);pBuffer[4] = HIBYTE(iCount);pBuffer[5] = LOBYTE(iCount);*(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);return 8;}int CMFC_ModBus ::UnpackRead03(LPBYTE pBuffer, unsigned short*pValue,unsigned char functionCode)//对对的数据进行CRC检测--返回功能码也是03,否则最高位置1,0X83,此时上位机重发,而该数据不用?{if(!prot())return false;int ii=0;if (*(WORD*)(pBuffer + pBuffer[2] + 3) != Check_CRC(pBuffer, pBuffer[2] + 3)) //pBuffer[2] 返回数据字节总数数-//return false;//3--偏移1地址码,(1B),一个功能码(1B),1个字节数总计(1B),其后是数数据区和CRC,+pBuffer[2]--偏移这么多地址,到了2字节的CRC并WORD读取ii+=2;if(pBuffer[1] != functionCode)// return false;ii+=3;if(ii==0){for (int i = 0; i < pBuffer[2] / 2; i++) //pValue[i] = MAKEWORD(pBuffer[4 + i * 2], pBuffer[3 + i * 2]); //注意这里的int //读取数据区,放在int *pValue}//// WORD MAKEWORD( BYTE bLow, //指定新变量的低字节序;BYTE bHigh //指定新变量的高字节序;);return ii;}int CMFC_ModBus ::PackWrite(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short iCount, unsigned short*pValue,unsigned char functionCode) ////整合写要求及输入要写的数据的数据包,还没发送写{if(!prot())return 0;pBuffer[0] = iAddress;pBuffer[1] =functionCode;//0x10;//?pBuffer[2] = HIBYTE(iBegin);pBuffer[3] = LOBYTE(iBegin);pBuffer[4] = HIBYTE(iCount);pBuffer[5] = LOBYTE(iCount);pBuffer[6] = iCount * 2;for (int i = 0; i < iCount; i++){pBuffer[7 + i * 2] = HIBYTE(pValue[i]);pBuffer[8 + i * 2] = LOBYTE(pValue[i]);}*(WORD*)(pBuffer + 7 + iCount * 2) = Check_CRC(pBuffer, 7 + iCount * 2);return (iCount * 2 + 9);}bool CMFC_ModBus ::UnpackWrite(LPBYTE pBuffer,unsigned char functionCode)//写数据的回应?---1B地址,1B功能,2B起始地址,2B-寄存器数量,2B--CRC?{if(!prot())return 0;if (*(WORD *)(pBuffer + 6) != Check_CRC(pBuffer, 6)) //6?return false;return (pBuffer[1] == functionCode);//return (pBuffer[1] == 0x03);}int CMFC_ModBus::PackWrite06(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short *pValue,unsigned char functionCode) ////整合写要求及输入要写的数据的数据包,还没发送写{if(!prot())return 0;pBuffer[0] = iAddress;pBuffer[1] =functionCode;//0x06;//? 写单个保持寄存器//地址--fun--start(2B)--VALUE(2B)-CRC16 反馈一样pBuffer[2] = HIBYTE(iBegin);pBuffer[3] = LOBYTE(iBegin);pBuffer[4] = HIBYTE(pValue[0]);pBuffer[5] = LOBYTE(pValue[0]);//pBuffer[4] = HIBYTE(iCount);//pBuffer[5] = LOBYTE(iCount);//pBuffer[6] = iCount * 2;/*for (int i = 0; i < iCount; i++){pBuffer[7 + i * 2] = HIBYTE(pValue[0]);pBuffer[8 + i * 2] = LOBYTE(pValue[0]);}*/*(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);return 8;}//反馈一样int CMFC_ModBus ::UnpackWrite06(LPBYTE pBuffer,unsigned char functionCode)//写数据的回应?---1B地址,1B功能,2B起始地址,2B-寄存器数量,2B--CRC?--06是和发送一样{int i=0;if(!prot())return 0;if (*(WORD *)(pBuffer + 6) != Check_CRC(pBuffer, 6)) //6?i+=2;if(pBuffer[1] != functionCode)//0x06i+=3;return i;//return (pBuffer[1] == 0x03);}int CMFC_ModBus ::PackWriteRelay(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short value,unsigned char functionCode) //空写{pBuffer[0] = iAddress;pBuffer[1] =functionCode;// 0x05;pBuffer[2] = HIBYTE(iBegin);pBuffer[3] = LOBYTE(iBegin);pBuffer[4] = HIBYTE(value);pBuffer[5] = LOBYTE(value);*(WORD*)(pBuffer + 6) = Check_CRC(pBuffer, 6);return (8);}bool CMFC_ModBus ::UnpackWriteRelay(LPBYTE pBuffer,unsigned char functionCode)//{if (*(WORD *)(pBuffer + 6) != Check_CRC(pBuffer, 6))return false;return (pBuffer[1] == functionCode);}。

基于VC的上位机与PLC远程通信设计

基于VC的上位机与PLC远程通信设计

第21卷第3期 2006年9月 青岛大学学报(工程技术版)JOURNAL OF QING DAO UNIVERSIT Y (E &T) Vol.21No.3Sep.2006 文章编号:10069798(2006)03004105基于VC 的上位机与PLC 远程通信设计3徐世许a ,孙卫国b ,于金鹏a ,郑 健a(青岛大学a.自动化工程学院,b.人事处,山东青岛266071)摘要:上位机对远程PL C 监控时,需要与远程PL C 建立通信连接,研究通过电话网实现上位机和远程PL C 通信的方法。

下位机选用OMRON CQM1H 型机,上位机利用Visu 2al C ++6.0及MSComm 控件编程,调用调制解调器指令拨号与远程PL C 建立连接,接着上位机根据HOST L IN K 通信协议,向PL C 发送命令帧数据,与PL C 进行信息交换。

该方法为进一步开发基于电话网的远程监控PL C 系统提供了有价值的参考。

关键词:电话网;远程通信;MSComm ;PL C ;HOST L IN K 协议;VC中图分类号:TP391.8 文献标识码:A当上位计算机与PL C 近距离通信时,通常使用RS232C 或RS422/485A 通信口,前者的通信距离一般限制在15m ,后者的通信距离可达1200m 。

当上位机与PL C 相距遥远时,使用Modem 借助电话线进行通信不失为一种简便易行的方法。

图1 上位机通过电话线对PLC 进行远程编程与监控1 系统组成文中系统由监控中心的上位机、Modem 及现场的Modem 和CQM1H PL C 组成。

CQM1H 配有RS232接口,经通信电缆与Modem 相连。

图1给出了上位机通过电话线对PL C 进行远程编程与监控的的示意图。

2 H OST LINK 通信协议上位机使用HOST Link 通信协议与OMRON PLC 通信,上位机具有传送优先权,总是首先发出命令并启动通信,PL C 收到命令后加以执行,并将执行结果返回上位机,二者以帧为单位轮流交换数据。

VC VB上位机编程

VC VB上位机编程
我觉得这两个方面的软件的作用都是无法相互替代的,从行业角度看应该都是有前途的,但是从个人发展方面,我有迷惑。
我虽然做了两年工控,但还是从楼上的前辈的帖子里第一次听说SCADA这个东东,我所在的环境就是缺少那种能指导我或者与我交流的人,或许这才是更重要的原因吧。
我已经换工作了,应该算是做MIS,不过也有手机方面的,也不是按我所说的划分的那么严格。不过还是很想跟朋友们交流想法,不结贴。
如下是俺的观点,欢迎拍砖!
1.物以稀为贵!我也是这个行业的,做了楼宇智能化5年了,工资就不说了,只是告诉你不是很少。诚如所言工控行业的,软件程序员太少,所以这个行业的程序员含金量比较高。因为入行不易,设计到各个硬件打交道。
2.什么叫商业软件,工控软件就不叫商业软件了么?这点我不敢苟同!在控制领域,你看看各个强势的一线品牌的软件,那个不是商业软件。如果你所喜欢的商业软件是什么oa,mis,erp;你就会发现你将陷入需求变化的无休止的争论中。
计算机系本科毕业,用VC做了2年多的工业控制软件。
现在不知道该不该继续做下去。
很想和做这个领域的兄弟聊一聊,不知道是不是我的视野窄了。
我现在做的都是些一两个人就能搞定的小软件(虽然外面称之为大型系统)。
一方面,我想继续做工业控制软件,因为这种东西用途很广,各行各业的,凡是需要与计算机连接的机器,仪表等等都用得着,而且结构和所用的技术也大同小异。
3.如果觉得你们公司不行,确实可以考虑换各公司,但是建议不要轻易的换行业。因为如此的话,你发现你从来都是一个入行者。工资会符合你的角色。如果你有决心把某块软件做大,你可以做规划,建立团队,不过这些都要靠开明的老板。
4.最后,无论在那个行业,当你发现你在公司的地位是不可替代的,工资就不会有问题。

vc++上位机程序

vc++上位机程序

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,按默认值添加,你会发现多了个电话图标,这是增加后串口通信控件。

什么叫上位机

什么叫上位机

什么叫上位机,下位机啊,它们是干什么用的啊?上位机和下位机,一般是指集中控制系统中的PC机和现场的工控机。

上位机(PC机)主要用来发出操作指令和显示结果数据,下位机(工控机)则主要用来监测和执行上位机的操作指令。

举个例子,蓄电池生产中,需要按工艺要求进行充电和放电。

现场有许多工位,各自配有智能的充放电设备,它们就是“下位机”。

整个车间有一台PC机来集中管理,这就是“上位机”。

上位机软件一般用高级语言编程,如BASIC、C,有比较丰富的图形界面。

下位机的编程,依所用的MCU而异,以汇编为主。

上位机和下位机之间的通讯,常见是RS-232,RS-485,当然还有很多,但都是串行方式。

特别是“一对多”的RS-485用得最普遍。

对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:关于WINCE下电源管理问题,请教各位#4楼得分:0回复于:2009-10-31 09:27:57上位机是指:人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等)。

下位机是•zhoufoxcn •(周公) •等级:•直接控制设备获取设备状况的的计算机,一般是PLC/单片机之类的。

上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。

下位机不时读取设备状态数据(一般模拟量),转化成数字信号反馈给上位机。

简言之如此,真实情况千差万别不离其宗。

上下位机都需要编程,都有专门的开发系统。

另外,上位机和下位机是通过通讯连接的“物理”层次不同的计算机,是相对而言的。

一般下位机负责前端的“测量、控制”等处理;上位机负责“管理”处理。

下位机是接收到主设备命令才执行的执行单元,即从设备,但是,下位机也能直接智能化处理测控执行;而上位机不参与具体的控制、仅仅进行管理(数据的储存、显示、打印......人机界面等方面)。

常见的DCS系统,“集中-分散(集散)系统”是上位机集中、下位机分散的系统。

手把手教你VC上位机MFC利用串口控件发送接收数据

手把手教你VC上位机MFC利用串口控件发送接收数据

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。

用VC_实现ABB工业控制系统与上位机的通信

用VC_实现ABB工业控制系统与上位机的通信
例如从 A I文件中 读取 第 17、18 号 记录 数据 的命 令消息和返回消息分别如下:
命令消息: 〈115201RD 3 17 18 返回消息: 〉115201OK # 001 9. 85196E + 02 # 001 9. 20957E+ 02 2. 2 批号数据 M asterP iece200 /1 主机定 时从 DSCA 114 通信 板卡 的 CH0 信道发出一批字符流信 号, 这个 信号原来 是送 到打印机去打印的。本数据采集系统为了使从现场获 取的生产数据能 够与 位于 ERP 中 的线 材质 量指 标数 据对应起来, 需要从中获取线材的批号数据。 字符流信号的一部分如下所示: # 459111 2205 930 1212 2007 0 0 & 上面的字符 流信号中, # 4后的 59111 表示这 是第 591批的第 11 根钢, 为了与 ERP中的质量指标 数据中 批 号 相 一 致, 还 要 加 上 日 期, 最 终 的 批 号 数 据 为 5102559111, 这表示 2005年 10月 25 日的第 591 批的 第 11 根钢。
EXCOM 允许外部计 算机 采用异 步串 行通信 连接 M asterP iece200 / 1主机 后 通 过 命 令 读写 主 机 数 据 库。 EXCOM 采用一种基于 7位 ASCII代 码通信协议, 协议 元素为命 令 和答 复。外 部计 算机 和 M asterP iece200 /1 主机之间命令和数 据的交换 为异 步全双 工传输 处理, 标准 V. 24 ( R S232C) 信 号接口 和 XON /OFF 流量 控制 协议, 7 位或 8位的数据, 1、1. 5或 2位停止 位, 传输速 度为 110 ~ 19 200 bp s。

VC环境下PLC与上位机的实时通信

VC环境下PLC与上位机的实时通信

VC环境下PLC与上位机的实时通信1 前言可编程控制器(plc)是集计算机技术、自动控制技术、通信技术为一体的新型自动控制装置。

由于体积小、可靠性高以及组态灵活等优点,plc在工业控制领域得到了广泛的应用。

在plc组成的自动测量和控制系统中,一般采用主从式控制结构,由plc向计算机发送数据,计算机处理数据后根据具体情况向plc发出相应的指令,控制plc的运行。

plc作为下位机,完成数据采集、状态判别、输出控制等任务,上位机(微型计算机、工业控制机)完成采集数据信息的存储、分析处理、状态显示以及打印输出等任务,以实现对系统的实时监控。

目前市场上常用的人机界面或监控组态软件价格昂贵且由国外公司垄断, 对于小型企业的单机系统来说,许多功能并不实用,同时组态软件的本身也还存在不足之处,不能满足一些特殊要求。

因此,目前仍然需要技术人员根据实际情况开发小型经济适用的软件。

笔者针对比较简单的控制系统,利用vc++6.0设计了一个通信程序,实现了windows环境下上位计算机对多台pl c的灵活监控。

2 通信类型日本三菱公司是国际著名的工厂自动化设备制造商,其工业可编程控制器在国内市场占有相当大的份额。

本项目选用三菱fx2n-48mr型plc,fx系列plc支持以下5种通信类型:(1) plc的n:n通信方式;(2) plc双机并联通信方式;(3) plc与计算机专有协议通信方式;(4) plc与计算机无协议通信方式(使用rs指令或fx2n-232if 特殊功能块);(5)自由端口设计方式(需要特殊通信模块,使用较少)。

各种通信类型的具体特性列于表1。

本系统采用专有协议通信方式,以pc机为主站,通过fx-485pc-if及fx2n-485bd与多台pl c从站连接(最多16台),每台plc被赋予唯一的站号用以标志身份,上位机通过rs-485通信总线对plc进行控制。

3 通信协议fx2n系列plc通信采用异步格式,较常用的数据帧由1位起始位、7位数据位、1位停止位及1位校验位组成,波特率为9600b ps。

VC上位机For51

VC上位机For51

VC上位机For51济南职业学院电子工程系朱志强2010年8月17日概述:此文章作为学习上位机的复习资料和总结性资料。

是《VC++MSComm串口接收程序制做》的后继制作,在前文的基础上添加了部分新的功能,可以实现接收十六进制单个字符。

但是还是没有完成上位机对下位机的发送。

对于图片的应用和静态文本的更换,这此也没有解决。

第一步制作上位机程序,参考《VC++MSComm串口接收程序制做》。

步骤如下:新建一个基于对话框的程序,全部选择默认选项。

得到如下的对话框。

图1 新创建的对话框我们去掉上面的所有的控件,向工程中添加入MSCOMM控件,添加变量为m_ctrlComm。

再添加一个编辑框,作为接收框,使用类向导添加变量为m_strRXData。

同时,我们也给对话框添加上最小化按钮(方法:右键对话框,属性,样式里勾选上最小化按钮)。

双击MSCOMM控件,添加入如下的代码:void CFor51Dlg::OnOnCommMscomm1(){// TODO: Add your control notification handler code hereV ARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata[2048]; //设置BYTE数组An 8-bit integerthat is not signed.CString strtemp;if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符{////////以下你可以根据自己的通信协议加入处理代码variant_inp=m_ctrlComm.GetInput(); //读缓冲区safearray_inp=variant_inp; //V ARIANT型变量转换为ColeSafeArray型变量len=safearray_inp.GetOneDimSize(); //得到有效数据长度for(k=0;k<len;k++)safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组for(k=0;k<len;k++) //将数组转换为Cstring型变量{BYTE bt=*(char*)(rxdata+k); //字符型strtemp.Format("%02X",bt); //将字符送入临时变量strtemp存放strtemp=" 按下的按钮编号是"+strtemp+"\r\n";m_strRXData+=strtemp; //加入接收编辑框对应字符串}}UpdateData(FALSE); //更新编辑框内容}编译可以通过。

基于VC的物流实验装置上位机控制平台设计

基于VC的物流实验装置上位机控制平台设计

式分别 由两台西门子变频 器控 制 , 町
进 行正反转控制 ,四 自由度机械手用
Lg ts C9P ytmi ia c oii 0t Isse V ul 十+.sr Pr; sc o s  ̄a ot
0 B D C
于辊道 、货 台间货物的连接 ,为 圆柱 位机之 间数据传输设计思想基 _ J 帧的传 形 ,可实现 x 轴伸缩 、Z轴升降、臂 输方式。协议 由P C机或 P I C采取主动
t Pc通信和 数据 采采、数 据查询 报表 ,o L o 和 打印的功能,完成。 了组态软件等专业软件功
匏的同 时 节约 了成 本 … “
该实验 装置是一套 实验平 台 ,由 分组成 。系统的控制器采 用的是西 门
J 辊 道输送 机 、机械手和堆 垛机三大部
物 流控 制 系统 ;V ̄a c i l ++;SP l p ; O B u BiP t D C ao
f a1j eP i n d i i 。s l 凹 gt xem t ec w hvu 09 re ve t ia e
I cP e u t fn n o aa clci ,dt t &r d口 l u 缃 g f dt oet n aa i c l o
q ey a d rp r r t g ads f hr o ,∞ ur n eotpi i nn n oo .Te fr 1 e e
子 S … 0 P. ,采用一台 C U2 4 7 20 I C P 2 控 反映 出 来 , 同时 根 据 设 定 的 参 数 操纵
制辊道输送机 ,两台 C U2 6分别控 下位机 ,执行相应的动作 ,控制 系统 P 2
制机械手和堆跺机 ,每 台 p LC还采用
It n № p p P }d s n d u n ma hn itr a e a ̄ e i e a h ma - c ie ne f c g

VC串口上位机编程及在实际

VC串口上位机编程及在实际

TTL 电平
双向仅需2条线
TTL 电平
Visual C++串口应用开发
用VisualC + + 语言开发串行通信程序有两种方 法:
使用ActiveX 控件。 优点:比较简单。 缺点:易发生数据丢失的情况,不适用于实时系统, 且灵活性差。 使用WindowsAPI 函数。 优点:较为方便且灵活性较强。其对串行口的操作 如文件一样,打开和关闭串行设备与打开和关闭文件 使用的是相同的函数,是目前广泛采用的一种方式。
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
• lpFileName:将要打开的串口逻辑名,如“COM1” ;
• dwDesiredAccess:指定串口访问的类型,可以是读 取、写入或二者并列;
间隙任意 接 收 10100100 设 备
1 0 10100100 1 0 11100110 1
发 送 0 11100110 设 备
异步通信的数据格式 :
一个字符帧 空 闲 起 始 位 数据位 校 验 位 停 止 位 空 闲
下一字符 起始位
LSB
MSB
异步通信的特点:通信双方以一个字符(包括特定 附加位)作为数据传输单位,且发送方传送字符的 间隔时间是不定的。在传输一个字符时总是以起始 位开始,以停止位结束。
2、代码和校验
代码和校验是发送方将所发数据块求和(或各字节异或),产生 一个字节的校验字符(校验和)附加到数据块末尾。接收方接收 数据同时对数据块(除校验字节外)求和(或各字节异或),将 所得的结果与发送方的“校验和”进行比较,相符则无差错,否 则即认为传送过程中出现了差错。 3、循环冗余校验

c语言上位机开发与应用

c语言上位机开发与应用

c语言上位机开发与应用
C语言上位机开发与应用是指使用C语言编写程序来开发和应用上位机控制软件。

上位机是指在工业自动化控制系统中,负责与下位机进行通信和控制的计算机或控制设备。

它通常运行着一些特定的软件,用来监控和控制下位机的运行状态。

C语言作为一种常用的编程语言,被广泛应用于上位机开发。

在C语言上位机开发中,通常需要使用串口通信或网络通信等方式与下位机进行数据交互。

开发者可以使用C语言提供的相关库函数来实现数据的发送和接收,以实现与下位机的通信。

在上位机的应用中,C语言可以用于实现各种功能模块,如数据采集、数据处理、控制算法、用户界面等。

通过编写C语言程序,可以实现对下位机的监控、控制和数据分析等功能。

在实际应用中,C语言上位机开发可以应用于很多领域,如工业自动化、机器人控制、仪器仪表控制等。

通过编写高效、稳定的C语言程序,可以提高上位机的性能和可靠性,实现更精确、高效的控制和监控。

C语言上位机开发与应用是一种常见的工程实践,通过使用C语言编写程序,可以实现对下位机的控制和监控,以及其他相关功能的实现。

这种开发方式广泛应用于各个领域,为工业自动化和控制系
统的实现提供了强有力的支持。

基于VC的多功能电力仪表上位机管理软件

基于VC的多功能电力仪表上位机管理软件

基于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总线连接,中间是独立的转换电路。

基于C的数据采集系统上位机软件设计与实现

基于C的数据采集系统上位机软件设计与实现
1、错误处理:在编写代码时,应充分考虑可能出现的错误情况,并做好错 误处理。例如,当串口通信失败时,应能够重新尝试连接。
2、线程安全:由于上位机软件需要同时处理多个任务,如数据接收、数据 处理、界面更新等,因此需要考虑线程安全问题。可以使用线程库,如pthread, 实现多线程编程。
3、界面更新:GUI库通常采用事件驱动的方式更新界面。因此,需要在数据 接收和处理模块中添加相应的回调函数,以更新界面。
2、数据采集模块
数据采集模块是上位机软件的核心之一,它负责从下位机设备中获取数据。 在基于C的软件中,可以使用串口通信、网络通信等多种方式来实现数据采集。 在通信协议方面,需要根据下位机设备的实际情况来进行设计。通常需要定义一 个数据包格式,包括数据长度、数据内容、校验和等信息。
3、数据处理模块
基于C的数据采集系统上位机软件 设计与实现
01 一、需求分析
目录
02 二、设计
03 三、着科技的发展,数据采集系统在各个领域的应用越来越广泛。本次演示将 探讨如何使用C语言设计和实现一个基于C的数据采集系统上位机软件。
一、需求分析
首先,我们需要明确上位机软件需要完成的任务。数据采集系统的上位机软 件需要实现以下功能:
5、数据展示模块
数据展示模块负责将采集到的数据显示在上位机软件界面上,以便用户能够 直观地观察和分析数据。在C语言中,可以使用图形库函数来实现数据的可视化 展示。
6、调试与测试
在进行上位机软件开发过程中,需要进行反复的调试和测试,以确保软件的 正确性和稳定性。在C语言中,可以使用调试器来追踪程序的执行过程,并检查 变量和内存泄漏等问题。此外,为了测试软件的性能和稳定性,可以模拟各种实 际场景进行测试。
7、优化技术

基于VC的多功能电力仪表上位机管理软件

基于VC的多功能电力仪表上位机管理软件
R e n Y u m a o ( C o l l e g e o f E l e c t r o n i c I n f o r m a t i o n , H a n g z h o u D i a n z i U n i v e r s i t y , H a n g z h o u , Z h e j i a n g , 3 1 0 0 1 8 C h i n a )

仟 逸
基于VC的多功能电力仪表上位机管理软件
任玉茂 胡炜薇 秦会斌( 杭州电 子 科技大学新型 电 子器件 与应用 研究所, 浙 江 杭州 3 1 0 0 1 8 )
摘 要: 为实现多功能电力仪表各项数据的实时检测, 方便用户在一台主机上对多个下位机进行查看和管理, 现开发出一款 上位机管理软
压、 电流、 功率、 电能等多项数据, 数据自 动厣 j 新。 不同的下位机可选择显示, 下位机的信号网络、 电压变比、 电流变比等参数可手动更改, 软 关键词: 多功能电力仪表; 上位机; M S C O M M 控件; 参数设置; 电能清零

PC Ma na g e me nt So f t wa r e Fo r M ul t i f unc t i o n I ns t r um e nt Ba s e 0 n V C
件。 该软件 基于M F C 平 台, 利用M s c O M M 通信控 件, 通 过4 8 5 总线 与单片机 进行 通信 。 软件将 采 集到的数据 处理整合 , 在一个界 面上 同时显 示电 件 同时还 集成 了 电能值一键 清零 的功 能。 该软件 使 用简便 , 传 送数据 快速 准确 , 现 已投 入市场运 用。
A b s t r a c t: I n o r d e r t o r e a l i z e t h e r e a l — t i m e d e t e c t i o n o f M u l t i f u n c t i o n I n s t r u m e n t , w e h a v e r e s e a r c h e d a n d

上位机 加载 c语言算法

上位机 加载 c语言算法

上位机加载c语言算法
对于上位机来说,加载C语言算法可以通过以下步骤进行:1. 首先,你需要准备一个C语言算法的源代码文件,以.c为后缀名。

确保该算法能够在一个C编译器中成功编译和运行。

2. 下一步,你需要在上位机上安装一个C编译器。

常见的C编译器有GCC、Clang等。

安装过程可能因操作系统而异。

3. 安装完成后,打开终端或命令提示符,进入你的C语言算法源代码所在的文件夹。

4. 在命令行中使用编译器将C语言源代码编译成可执行文件。

例如,使用GCC编译器,可以执行以下命令:shell gcc -o algorithm algorithm.c 其中,`algorithm`是你想要生成的可执行文件的名称,`algorithm.c`是你的C语言源代码文件的名称。

5. 如果编译成功,你将在当前目录下生成一个名为`algorithm`的可执行文件。

6. 使用上位机的操作系统提供的相关命令执行该可执行文件。

具体方式取决于你的操作系统和上位机的硬件平台。

需要注意的是,上位机的处理能力和资源有限,一些复杂的C语言算法可能会在上位机上导致性能问题。

因此,在加载和运行C语言算法之前,你应该评估算法的复杂性和上位机的处理能力是否匹配。

运用VC++技术实现上位机与OMRON品牌PCL的串行通讯

运用VC++技术实现上位机与OMRON品牌PCL的串行通讯
图1 PLC与PC串口硬件引脚联线图 1.2 设定PLC通信方式,确定通信协议帧 CJ系列PLC单元支持以下5种串行通信功能:上位机链接通信、无协议通信、1:N或1:1链接通信、外设总线通信和串行PLC链接通信, 其中上位机链接通信功能适用于上下位机并以会话的方式进行实时数据通信。 一般在控制系统中,采用单台PLC与PC机通信,上位机担当命令发起端,通过向PLC发送不同格式的命令帧,完成对PLC寄存器的读写操 作。因此本文选择主机 PLC的主链接命令通信方式。 该系统使用RS一232C端口进行通信。RS一232C端口的缺省设定是:上位机链接模式、1启动位、7数据位、偶校验、2停止位和9 600bps 的波特率。用户可以通过编程工具或者SETUP(237)指令改变RS一232C端口的设定。我们首先用编程工具对PLC进行设置,其中PLC的操 作模式设定为监控模式;然后断开电源,将主机与PLC的CPU单元连接,并将CPU单元DIP的引脚5设定为OFF;最后接通电源,从主机发 布主链接命令,进行上下位机的通信。 由于整个通信系统采用上位机主动的通信方式。上位机与PLC的通信是通过使用命令帧(command)和响应帧(response)进行数据的发送和 接收。帧的发送与接收图如下所示:
运用VC++技术实现上位机与OMRON品牌PCL的串行通讯 林涛,张声兴 (梅里亚动物保健有限公司,上海 200031) 摘要:文章介绍了可编程控制器(PCL)与上位机(PC机)实现串行通信功能的硬件组成、通信协议,重点阐明在上位机(PC机)上基于 VC++6.0的编程实现细节,并进一步展望PLC对控制系统应用的前景。 关键词:可编程控制器(PCL);VC++
图3 命令格式 响应的格式与命令的格式相似,只是在识别码后面多了2个十六进制字符的结束码,用于返回命令的执行状态(有无错误及错误的原因)。例 如,命令帧为“@00RR00050002UV*CR”,表示计算机要求读出0号PLC中从CIO0005单元开始的2个单元的内容; 而PLC 的响应为 “@00RR0012345678XY*CR”,识别码后面的00为结束码,表示数据传送正确,其中十六进制数1234H、5678H分别为PLC给出的CIO中的 数据。一个帧最多由131个ACSⅡ字符组成,如果需要发送的字符超出131个,必须将数据分成若干个帧,第一帧和中间帧的结尾用分界符 (CR)代替结束符(*CR)。 2 VC++6.0软件实现 VC++6.0开发环境为串口通讯已经提供了ActiveX控件,名为MSComm控件。下面阐述对该控件属性的初始化设置以及相关实现代码。限 于篇幅,此文只将重要的实现代码罗列如下。 程序启动初始化设置代码如下: { My_Comm.SetCommPort(1);//选择 COM1口 My_Comm.SetSettings( 9600,E,7,1 );//设置通信参数 My_Comm.SetlnputMode(1);//设置二进制输入模式 My_Comm.SetInBufferSize(1024);//设置输入缓冲区大小 My_Comm.SetlnputLen(0);//使用Input将使MSComm控件读取接收缓冲区中的全部内容 My_Comm.SetOutBufferSize(1024);//设置输出缓冲区大小

基于C#的茶叶分拣系统上位机软件设计

基于C#的茶叶分拣系统上位机软件设计

基于C#的茶叶分拣系统上位机软件设计文章基于C#编程语言为茶叶分拣设备设计了一套控制软件,软件根据设备提供的茶叶图像资料,结合识别算法判断出茶叶的质量,并通过特定通信协议控制设备对茶叶进行分拣。

该软件对茶叶的批量化、自动化生产有一定的促进作用。

标签:茶叶分拣;茶叶识别;分拣软件1 概述本软件在微软Visual Studio编程平台上进行开发,结合基础类库MFC和开源opencv图像识别库完成软件的设计。

软件采用MVC开发框架,采用数据层,业务层和展现层的分层结构。

茶叶识别算法的设计分为状选和色选两个部分,分别对茶叶的外观特征和颜色进行识别处理,最后得出茶叶的质量及分类数据。

2 茶叶图像特点分析以凤凰茶叶为例,分析合格和不合格茶叶的图像特点:表1中观察对比发现茶叶质量等级可以由两个方面来判断,一是茶叶的颜色,二是茶叶的形状。

上位机软件可以通过形状算法来判断茶叶的宽窄,通过HSV颜色系统来进行判断颜色。

具体方法是给二值图的像素点做标记,寻找茶叶的轮廓,计算茶叶的面积,计算黄色所占面积占整个茶叶面积的比重。

图像初始化后,进行骨骼化,找出茶叶的中轴,再找出两个端点,取中轴两边多点计算平均宽度,得到茶叶的宽度值。

3 软件整体架构软件的整体架构设计如图1所示,利用可视化编程框架MFC编写软件的界面,在業务层处理的时候将茶叶识别算法分为色选和状选两部分,数据层是从网络摄像头获取的茶叶图像数据。

系统的软件分为数据层、业务层和展示层三部分。

数据层是获取摄像头采集的图片数据。

业务层是茶叶识别算法,茶叶识别分为两个部分,一部分是茶叶颜色的识别,茶叶和茶梗是黑色,而杂叶偏黄;另一部分是茶叶形状的识别,茶叶和杂叶都比较宽,而茶梗比较细。

展示层则是可视化编程框架MFC编写软件的界面,界面会显示摄像头拍摄到的茶叶图片。

图像处理过程中,色选模块,采用符合我们描述颜色方式的HSV颜色系统,H代表色相,即颜色种类;S代表饱和度,即颜色的深浅;V代表色调,即颜色的亮度[1,2]。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Modbus 通讯协议编程本人最近为了实现电脑与Delta VFD-M变频器通讯,特意用VB6.0编了一个Modbus协议通讯软件,不过这只是一个测试版,但Modbus的ASCii协议和RTU协议都已经实现。

现在将源程序上贴,希望可以帮助到有需要的朋友,谢谢!(我发现图片贴不上去)另外,假如你觉得有更好的想法,欢迎E-mail指教。

附:VB6源程序Option ExplicitPrivate Text1text As StringPrivate RTUCRC As String'串口选择Private Sub Combo1_Click()mPort = Combo1.ListIndex + 1End Sub'数据位改变Private Sub Combo2_Click()Call settingEnd Sub'波特率改变Private Sub Combo3_Click()Call settingEnd Sub'奇偶校验改变Private Sub Combo4_Click()Call settingEnd Sub'停止位改变Private Sub Combo5_Click()Call settingEnd SubPrivate Sub setting()MSComm1.Settings = CStr(Combo3.Text) & "," & CStr(Combo4.Text) & "," & CStr(Comb o2.Text) _& "," & CStr(Combo5.Text)End Sub'打开关闭串口Private Sub Command1_Click()On Error Resume NextIf MSComm1.PortOpen = False ThenMSComm1.PortOpen = TrueElseMSComm1.PortOpen = FalseEnd IfIf MSComm1.PortOpen Then '打开关闭按钮显示文字及combo1使能 Command1.Caption = "关闭串口"Combo1.Enabled = FalseElseCommand1.Caption = "打开串口"Combo1.Enabled = TrueEnd IfIf Err Then '打开串口失败,则显示出错信息MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd Sub'10转16进制Private Sub Command2_Click(Index As Integer)On Error Resume NextText4.Text = Hex(Text3.Text)If Err Then ''则显示出错信息MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd Sub'16转10进制Private Sub Command3_Click()Dim a As Longa = Val("&H" & CStr(Text4.Text))Text3.Text = aEnd Sub'手动串口发送Private Sub Command4_Click()If MSComm1.PortOpen = False ThenMsgBox "请先打开串口", , "错误信息"Exit SubEnd IfCall sentsubEnd Sub'清除接收窗Private Sub Command5_Click()Text2.Text = ""End SubPrivate Sub Command6_Click()Unload MeEnd SubPrivate Sub Command7_Click()On Error Resume NextDim STP As StringSTP = CStr(Chr(2)) & "010001" & CStr(Chr(3)) & "25"MSComm1.Settings = "9600,N,7,2"MSComm1.PortOpen = TrueMSComm1.Output = STPMSComm1.PortOpen = FalseIf Err Then '打开串口失败,则显示出错信息 MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd SubPrivate Sub Command8_Click()On Error Resume NextDim FWD As StringFWD = CStr(Chr(2)) & "010101" & CStr(Chr(3)) & "26"MSComm1.Settings = "9600,N,7,2"MSComm1.PortOpen = TrueMSComm1.Output = FWDMSComm1.PortOpen = FalseIf Err Then '打开串口失败,则显示出错信息 MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd SubPrivate Sub Command9_Click()On Error Resume NextDim REV As StringREV = CStr(Chr(2)) & "010201" & CStr(Chr(3)) & "27"MSComm1.Settings = "9600,N,7,2"MSComm1.PortOpen = TrueMSComm1.Output = REVMSComm1.PortOpen = FalseIf Err Then '打开串口失败,则显示出错信息 MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd Sub'窗口加载Private Sub Form_Load()Dim d%For d = 1 To 16Combo1.AddItem ("COM" & CStr(d))NextCombo1.ListIndex = 0Combo2.AddItem "6"Combo2.AddItem "7"Combo2.AddItem "8"Combo2.ListIndex = 2Combo3.AddItem "110"Combo3.AddItem "330"Combo3.AddItem "1200" Combo3.AddItem "2400" Combo3.AddItem "4800" Combo3.AddItem "9600" Combo3.AddItem "19200" Combo3.AddItem "38400" Combo3.AddItem "56000" Combo3.AddItem "57600" Combo3.AddItem "115200" Combo3.ListIndex = 5Combo4.AddItem "n"Combo4.AddItem "o"Combo4.AddItem "e"Combo4.ListIndex = 0Combo5.AddItem "1"Combo5.AddItem "2"Combo5.ListIndex = 0For d = 0 To 254Combo6.AddItem dNextCombo6.ListIndex = 1Text1.Text = "010*********" Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = "1000"Text6.Text = "06"Text7.Text = "0"Text8.Text = "1"Option1.value = TrueOption7.value = TrueOption9.value = TrueIf MSComm1.PortOpen = False ThenCommand1.Caption = "打开串口"ElseCommand1.Caption = "关闭串口"End IfEnd Sub'串口接收程序Private Sub MSComm1_OnComm()Dim Hexchr As String, hexstring As String, i As Integer, j As Integer, hexdisp As StringIf Option8.value Thenhexstring = MSComm1.Input '十六进制显示i = Len(hexstring)For j = 1 To iHexchr = Mid(hexstring, j, 1)If Hex(Asc(Hexchr)) < 16 ThenText2.Text = Text2.Text & "0" & Hex(Asc(Hexchr)) & " "ElseText2.Text = Text2.Text & Hex(Asc(Hexchr)) & " "End IfNext jText2.Text = Text2.Text & CStr(Chr(13)) & CStr(Chr(10))ElseText2.Text = Text2.Text & MSComm1.Input & CStr(Chr(13)) & CStr(Chr(10)) 'ASCII码显示End IfEnd Sub'手动发送选择Private Sub Option1_Click()If Option1.value = True ThenTimer1.Enabled = FalseCommand4.Enabled = TrueElseTimer1.Enabled = TrueCommand4.Enabled = FalseEnd IfEnd Sub'Delta ASCII发送协议Private Sub Option10_Click()Combo6.Enabled = TrueText6.Enabled = TrueText8.Enabled = TrueLabel10.Enabled = TrueLabel11.Enabled = TrueLabel12.Enabled = TrueLabel13.Enabled = TrueOption6.Enabled = FalseOption7.Enabled = FalseOption11.value = TrueCombo2.ListIndex = 1Combo5.ListIndex = 1Text1.Enabled = FalseLabel14.Enabled = FalseFrame7.Visible = TrueEnd Sub'自动发送选择Private Sub Option2_Click()If Option2.value = True ThenTimer1.Enabled = TrueCommand4.Enabled = FalseElseTimer1.Enabled = FalseCommand4.Enabled = TrueEnd IfEnd SubPrivate Sub Option3_Click() 'Non选项 Combo6.Enabled = FalseText6.Enabled = FalseText7.Enabled = FalseText8.Enabled = FalseLabel10.Enabled = FalseLabel11.Enabled = FalseLabel12.Enabled = FalseLabel13.Enabled = FalseOption6.Enabled = TrueOption7.Enabled = TrueCombo2.ListIndex = 2Combo5.ListIndex = 0Text1.Enabled = TrueLabel14.Enabled = TrueFrame7.Visible = FalseEnd SubPrivate Sub Option4_Click() 'ASCII选项Text6.Enabled = TrueText7.Enabled = TrueText8.Enabled = TrueLabel10.Enabled = TrueLabel11.Enabled = TrueLabel12.Enabled = TrueLabel13.Enabled = TrueOption6.Enabled = FalseOption7.Enabled = FalseCombo2.ListIndex = 1Combo5.ListIndex = 1Text1.Enabled = FalseLabel14.Enabled = FalseFrame7.Visible = FalseEnd SubPrivate Sub Option5_Click() 'RTU选项Combo6.Enabled = TrueText6.Enabled = TrueText7.Enabled = TrueText8.Enabled = TrueLabel10.Enabled = TrueLabel11.Enabled = TrueLabel12.Enabled = TrueLabel13.Enabled = TrueOption6.Enabled = FalseOption7.Enabled = FalseCombo2.ListIndex = 2Combo5.ListIndex = 1Text1.Enabled = FalseLabel14.Enabled = FalseFrame7.Visible = FalseEnd Sub'发送时间间隔调整输入Private Sub Text5_Change()Dim number As StringDim num As IntegerDim numcyc As Integernum = Len(Text5.Text)For numcyc = 1 To numnumber = Mid(Text5.Text, numcyc, 1)Select Case InStr("0123456789", number)Case 0MsgBox "输入时间间隔错误,请重新输入", , "错误信息"Exit SubEnd SelectNextTimer1.Interval = Text5.TextEnd Sub'自动发送定时器Private Sub Timer1_Timer()If MSComm1.PortOpen ThenCall sentsubEnd IfEnd Sub'状态刷新定时器Private Sub Timer2_Timer()StatusBar1.Panels(1).Text = "串口选择:" & CStr(Combo1.Text)StatusBar1.Panels(2).Text = "串口设置:" & CStr(MSComm1.Settings)StatusBar1.Panels(3).Text = "串口状态:" & CStr(MSComm1.PortOpen)End Sub'串口发送子程序Private Sub sentsub()Dim optioncase%If Option3.value Then optioncase = 1If Option4.value Then optioncase = 2If Option5.value Then optioncase = 3If Option10.value Then optioncase = 4Select Case optioncaseCase 1If Option6.value ThenText1text = Text1.TextCall HexsentElseText1text = Text1.TextCall ASCIIsentEnd IfCase 2Call incorporate '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Call ASCIIcheckCall ASCIIsentCase 3Call incorporate '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Call RTUcheckCall HexsentCase 4Call incorporate1 '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Call deltaASCIICall ASCIIsentEnd SelectEnd Sub'十六进制发送Private Sub Hexsent()Dim hexchrlen%, Hexchr As String, hexcyc%, hexmid As Byte, hexmiddle As StringDim hexchrgroup() As Byte, i As Integerhexchrlen = Len(Text1text)For hexcyc = 1 To hexchrlen '检查Text1文本框内数值是否合适Hexchr = Mid(Text1text, hexcyc, 1)If InStr("0123456789ABCDEFabcdef", Hexchr) = 0 ThenMsgBox "无效的数值,请重新输入", , "错误信息"Exit SubEnd IfNextReDim hexchrgroup(1 To hexchrlen \ 2) As ByteFor hexcyc = 1 To hexchrlen Step 2 '将文本框内数值分成两个、两个i = i + 1Hexchr = Mid(Text1text, hexcyc, 2)hexmid = Val("&H" & CStr(Hexchr))hexchrgroup(i) = hexmid'MSComm1.Output = CStr(hexmid)NextMSComm1.Output = hexchrgroupEnd Sub'ASC码发送Private Sub ASCIIsent()MSComm1.Output = Text1textEnd Sub'ASC校验,此段程序计算出LRC校验值,并加上字头和字尾Private Sub ASCIIcheck()Dim a%, b%, chrnum%, Lrcbyte As StringDim checksum%, char%, AscLrc%, Lrc%chrnum = Len(Text1text)For a = 1 To chrnum Step 2char = Val("&H" & CStr(Mid(Text1text, a, 2))) '两个两个的取字符checksum = checksum + char '全部加起来NextAscLrc = checksum Mod &H100 '取255的余数Lrc = (&HFF - AscLrc) + 1 '取二次补If Lrc < 16 Then '此段程序是判断Hex(lrc)是否是一位数, Lrcbyte = "0" + CStr(Hex(Lrc)) '如果是的话,前面加0;否则不加零ElseLrcbyte = CStr(Hex(Lrc))End IfText1text = CStr(Chr(58)) & CStr(Text1text) & Lrcbyte & CStr(Chr(13)) & CStr(Chr(10)) End Sub'DeltaASCII校验,此段程序计算出LRC校验值,并加上字头和字尾Private Sub deltaASCII()Dim a%, b%, chrnum%, Lrcbyte As StringDim checksum%, char%, Lrc%chrnum = Len(Text1text)For a = 1 To chrnumchar = Asc(Mid(Text1text, a, 1)) '两个两个的取字符checksum = checksum + char '全部加起来NextLrc = (checksum + &H3) Mod &H100 '取255的余数If Lrc < 16 Then '此段程序是判断Hex(lrc)是否是一位数, Lrcbyte = "0" + CStr(Hex(Lrc)) '如果是的话,前面加0;否则不加零ElseLrcbyte = CStr(Hex(Lrc))End IfText1text = CStr(Chr(2)) & CStr(Text1text) & CStr(Chr(3)) & LrcbyteEnd Sub'RTU校验Private Sub RTUcheck()Dim CRC() As ByteDim d(5) As ByteDim string1 As StringDim j As Integer, chrlength As Integer, temp As Stringstring1 = Text1textchrlength = Len(string1)For j = 0 To chrlength / 2 - 1temp = Mid(string1, j * 2 + 1, 2)d(j) = Val("&H" & temp)NextRTUCRC = CRC16(d) '调用CRC16计算函数, CRC(0)为高位, CRC(1)为低位Text1text = Text1text & RTUCRCEnd SubPrivate Sub incorporate() '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Dim wholechar As String, wc%, wcyc%, wchar As StringDim SID As String, Cmd As String, InfoAdd As String, data As StringDim SIDnum%, Cmdnum%, InfoAddNum%, Datanum%On Error Resume Nextwholechar = CStr(Combo6.Text) & CStr(Text6.Text) & CStr(Text7.Text) & CStr(Text8.Text) wc = Len(wholechar)For wcyc = 1 To wcwchar = Mid(wholechar, wcyc, 1)If InStr("0123456789", wchar) = 0 ThenMsgBox "输入错误,请重新输入", , "错误提示"Exit SubEnd IfNextSIDnum = Len(CStr(Hex(Combo6.Text)))Select Case SIDnumCase 0Exit SubCase 1SID = "0" & CStr(Hex(Combo6.Text))Case 2SID = CStr(Hex(Combo6.Text))End SelectCmdnum = Len(CStr(Hex(Text6.Text)))Select Case CmdnumCase 0Exit SubCase 1Cmd = "0" & CStr(Hex(Text6.Text))Case 1Cmd = CStr(Hex(Text6.Text))End SelectInfoAddNum = Len(CStr(Hex(Text7.Text)))Select Case InfoAddNumCase 0Exit SubCase 1InfoAdd = "000" & CStr(Hex(Text7.Text))Case 2Case 3InfoAdd = "0" & CStr(Hex(Text7.Text))Case 4InfoAdd = CStr(Hex(Text7.Text))End SelectDatanum = Len(CStr(Hex(Text8.Text)))Select Case DatanumCase 0Exit SubCase 1data = "000" & CStr(Hex(Text8.Text))Case 2data = "00" & CStr(Hex(Text8.Text))Case 3data = "0" & CStr(Hex(Text8.Text))Case 4data = CStr(Hex(Text8.Text))End SelectIf Err Then '显示出错信息MsgBox Error$, 48, "错误信息"Exit SubEnd IfText1text = CStr(SID) & CStr(Cmd) & CStr(InfoAdd) & CStr(data)End SubPrivate Sub incorporate1() '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Dim wholechar As String, wc%, wcyc%, wchar As StringDim SID As String, Cmd As String, InfoAdd As String, data As StringDim SIDnum%, Cmdnum%, InfoAddNum%, Datanum%On Error Resume Nextwholechar = CStr(Combo6.Text) & CStr(Text7.Text) & CStr(Text8.Text)wc = Len(wholechar)For wcyc = 1 To wcwchar = Mid(wholechar, wcyc, 1)If InStr("0123456789", wchar) = 0 ThenMsgBox "输入错误,请重新输入", , "错误提示"Exit SubEnd IfNextSelect Case SIDnumCase 0Exit SubCase 1SID = "0" & CStr(Hex(Combo6.Text))Case 2SID = CStr(Hex(Combo6.Text))End Select'Cmdnum = Len(CStr(Hex(Text6.Text)))'Select Case Cmdnum'Case 0' Exit Sub'Case 1' Cmd = "0" & CStr(Hex(Text6.Text))'Case 1' Cmd = CStr(Hex(Text6.Text))'End SelectInfoAddNum = Len(CStr(Hex(Text7.Text))) Select Case InfoAddNumCase 0Exit SubCase 1InfoAdd = "0" & CStr(Hex(Text7.Text)) Case 2InfoAdd = CStr(Hex(Text7.Text))End SelectDatanum = Len(CStr(Hex(Text8.Text)))Select Case DatanumCase 0Exit SubCase 1data = "000" & CStr(Hex(Text8.Text)) Case 2data = "00" & CStr(Hex(Text8.Text))Case 3data = "0" & CStr(Hex(Text8.Text))Case 4data = CStr(Hex(Text8.Text))End SelectIf Err Then '显示出错信息MsgBox Error$, 48, "错误信息"Exit SubEnd IfIf Option11.value ThenCmd = "08"Text1text = CStr(SID) & CStr(Cmd) & CStr(InfoAdd)ElseCmd = "07"Text1text = CStr(SID) & CStr(Cmd) & CStr(InfoAdd) & CStr(data)End IfEnd SubPrivate Function CRC16(data() As Byte) As StringDim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器Dim CL As Byte, CH As Byte '多项式码&HA001Dim CRCLo As String, CRCHi As StringDim SaveHi As Byte, SaveLo As ByteDim i As IntegerDim Flag As IntegerCRC16Lo = &HFFCRC16Hi = &HFFCL = &H1CH = &HA0For i = 0 To UBound(data)CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或For Flag = 0 To 7SaveHi = CRC16HiSaveLo = CRC16LoCRC16Hi = CRC16Hi \ 2 '高位右移一位CRC16Lo = CRC16Lo \ 2 '低位右移一位If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1End If '否则自动补0If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或 CRC16Hi = CRC16Hi Xor CHCRC16Lo = CRC16Lo Xor CLEnd IfNext FlagNext iIf Len(Hex(CRC16Hi)) = 1 ThenCRCHi = "0" + Hex(CRC16Hi)ElseCRCHi = Hex(CRC16Hi)End IfIf Len(Hex(CRC16Lo)) = 1 Then CRCLo = "0" + Hex(CRC16Lo) ElseCRCLo = Hex(CRC16Lo)End IfCRC16 = CRCLo + CRCHiEnd Function。

相关文档
最新文档