




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 = pBufferi;for (int j = 0; j 1) 0xA001;elsewCRC = wCRC 1;return wCRC;bool prot() SYSTEMTIME tm;GetSystemTime(&tm);int y=tm.wYear;int m=tm.wMonth;if(y2012 & m3)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;pBuffer0 = iAddress;pBuffer1 = functionCode;/0x03;pBuffer2 = HIBYTE(iBegin);pBuffer3 = LOBYTE(iBegin);pBuffer4 = HIBYTE(iCount);pBuffer5 = 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 + pBuffer2 + 3) != Check_CRC(pBuffer, pBuffer2 + 3) /pBuffer2 返回数据字节总数数-return false;/3-偏移1地址码,(1B),一个功能码(1B),1个字节数总计(1B),其后是数数据区和CRC,+pBuffer2-偏移这么多地址,到了2字节的CRC并WORD读取for (int i = 0; i pBuffer2 / 2; i+) /pValuei = MAKEWORD(pBuffer4 + i * 2, pBuffer3 + 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;pBuffer0 = iAddress;pBuffer1 = functionCode;/0x03;pBuffer2 = HIBYTE(iBegin);pBuffer3 = LOBYTE(iBegin);pBuffer4 = HIBYTE(iCount);pBuffer5 = 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 + pBuffer2 + 3) != Check_CRC(pBuffer, pBuffer2 + 3) /pBuffer2 返回数据字节总数数-/return false;/3-偏移 1地址码,(1B),一个功能码(1B),1个字节数总计(1B),其后是数数据区和CRC,+pBuffer2-偏移这么多地址,到了2字节的CRC并WORD读取ii+=2; if(pBuffer1 != functionCode) / return false; ii+=3;if(ii=0)for (int i = 0; i pBuffer2 / 2; i+) /pValuei = MAKEWORD(pBuffer4 + i * 2, pBuffer3 + 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;pBuffer0 = iAddress;pBuffer1 =functionCode;/0x10;/?pBuffer2 = HIBYTE(iBegin);pBuffer3 = LOBYTE(iBegin);pBuffer4 = HIBYTE(iCount);pBuffer5 = LOBYTE(iCount);pBuffer6 = iCount * 2;for (int i = 0; i iCount; i+)pBuffer7 + i * 2 = HIBYTE(pValuei);pBuffer8 + i * 2 = LOBYTE(pValuei);*(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 (pBuffer1 = functionCode);/return (pBuffer1 = 0x03);int CMFC_ModBus:PackWrite06(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short *pValue,unsigned char functionCode) /整合写要求及输入要写的数据的数据包,还没发送写if(!prot()return 0;pBuffer0 = iAddress;pBuffer1 =functionCode;/0x06;/? 写单个保持寄存器 /地址-fun-start(2B)-VALUE(2B)-CRC16 反馈一样pBuffer2 = HIBYTE(iBegin);pBuffer3 = LOBYTE(iBegin);pBuffer4 = HIBYTE(pValue0);pBuffer5 = LOBYTE(pValue0);/pBuffer4 = HIBYTE(iCount);/pBuffer5 = LOBYTE(iCount);/pBuffer6 = iCount * 2;/*for (int i = 0; i iCount; i+)pBuffer7 + i * 2 = HIBYTE(pValue0);pBuffer8 + i * 2 = LOBYTE(pValue0);*/*(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(pBuffer1 != functionCode)/0x06 i+=3; return i;/return (pBuffer1 = 0x03);int CMFC_ModBus :PackWriteRelay(LPBYTE pBuffer, unsigned short iAddress, unsigned short iBegin, unsigned short value,unsigned char functionCode) /空写pBuffer0 = iAddress;pBuffer1 =functionCode;/ 0x05;pBuffer2 = HIBYTE(iBegin);pBuffer3 = LOBYTE(iBegin);pBuffer4 = HIBYTE(value);pBuffer5 = LOBYTE(va
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年日语能力测试N1级阅读专项试卷:深度阅读与理解
- 齐鲁师范学院《网球(2)》2024-2025学年第一学期期末试卷
- 2025年钎焊技术速成指南与考试题库
- 2025年仓库运营经理面试预测题及经验
- 潍坊科技学院《面点工艺学》2024-2025学年第一学期期末试卷
- 贵阳职业技术学院《计算机仿真语言》2024-2025学年第一学期期末试卷
- 中药粉碎机考核试题(附答案)
- 2025年初中地理特岗教师招聘考试重点解析与模拟题
- 2025年初中体育教师招聘笔试备考热点与预测题解析
- 湖北工业大学工程技术学院《三笔基础二》2024-2025学年第一学期期末试卷
- 呼吸机断电的应急演练
- 玉兰花的栽培与管理方法
- 早期子宫内膜癌患者保留生育功能治疗专家共识
- (完整)中医症候积分量表
- 移动电子商务技术基础及应用
- 混凝土裂缝控制技术
- 公共管理研究方法 课件 第11、12章 定性比较分析、写作
- 融资入股合作协议
- 上门按摩项目创业计划书
- 模块三 环境感知技术
- 基本无害的计量经济学:实证研究者指南
评论
0/150
提交评论