ÎÄÖнéÉÜÁËModbus RTUͨѶÐÒéµÄÌص㣬²ûÊöÁ˸ÃÐÒéÔÚVC2005±à³Ì»·¾³ÏÂÉê¿Úµ÷ÊÔÈí¼þµÄ¾ßÌåʵÏÖ·½·¨¡£²¢±àÖÆÁËÏà¹ØµÄ³ÌÐò£¬¸Ã³ÌÐò²ÉÓÃÁËÄ£¿é»¯Ë¼Ï룬½á¹¹ÇåÎú£¬²Ù×÷¼ò±ã£¬ÊµÏÖÁËÁ¼ºÃµÄModbusRTU±¨ÎÄ´¢´æ¼°¹ÜÀí»úÖÆ£¬Ê¹ÓöàÏ̼߳æ¹Ë½çÃæÏÔʾºÍÊý¾ÝͨѶ£¬ÍêÈ«¼æÈÝModbuaRTUͨѶÐÒ飬¿ÉÓÃÓÚ×Ô¶¨Ò幦ÄÜÂëµÄModbus¼æÈÝÉ豸µÄµ÷ÊÔ£¬¿Ë·þÁËÆÕͨModbusµ÷ÊÔÈí¼þ½öÄÜÓÃÓÚModbus±ê×¼¹¦ÄÜÂëµ÷ÊԵIJ»×㡣ʵ¼ùÖ¤Ã÷£¬¸Ã³ÌÐò±àÖÆ˼ÏëºÏÀí¡¢ÔËÐÐÎȶ¨¡¢²Ù×÷¼ò±ãÒ×ÐУ¬Îª¹¤Òµ×Ô¶¯»¯ÖÐModbusÉ豸µÄµ÷ÊÔ´øÀ´·½±ã¡£
ModbusͨÐÅÐÒéÊÇModieon¹«Ë¾¿ª·¢µÄÒ»ÖÖͨÐÅÐÒ飬Ëü²ÉÓÃÖ÷´ÓÎÊ´ð·½Ê½¹¤×÷£¬ÊÇÒ»ÖÖÕæÕý¿ª·Å¡¢±ê×¼µÄ¡¢ÃâÊÕÐí¿É·ÑµÄÍøÂçͨÐÅÐÒé¡£¹ã·ºÓÃÓÚ×Ô¶¯»¯¿ØÖÆÆ÷ºÍ²â¿ØÒÇ±í£¬ÏÖÒѳÉΪһÖÖ¹«ÈϵÄͨÓù¤Òµ±ê×¼¡£Èç½ñModbusÐÒéÒѾ³ÉΪÎÒ¹ú¹¤Òµ×Ô¶¯»¯ÍøÂçÐÒé¹æ·¶µÄ¹ú¼Ò±ê×¼Ö®Ò»¡£²»Í¬³§ÉÌÉú²úµÄ¿ØÖÆÉ豸¿ÉÒÔ¼®´ËÁ¬³É¹¤ÒµÍøÂç¡£½øÐм¯Öмà¿Ø¡£¸ÃÐÒéÓÐ2ÖÖ´«Êäģʽ£¬¼´RTUģʽºÍASCIIģʽ¡£¶ÔÓÚASCIIģʽ£¬Ò»¸öÐÅÏ¢Ö¡ÖеÄÿ8λµÄ×Ö½Ú×÷Ϊ2¸öASCII×Ö·û´«Êä;¶ø¶ÔÓÚRTUģʽ¡£ÐÅÏ¢Ö¡ÖеÄ8λÊý¾Ý×÷Ϊ2¸ö4λ16½øÖÆ×Ö·û£¬Ïà¶ÔÓÚASCIIģʽ£¬RTUģʽ±í´ïÏàͬµÄÐÅÏ¢ÐèÒª½ÏÉÙµÄλÊý£¬ÇÒÔÚÏàͬͨÐÅËÙÂÊϾßÓиü´óµÄÊý¾ÝÁ÷Á¿¡£Òò´Ëͨ³£Çé¿öÏ£¬Ò»°ã¹¤ÒµÖÇÄÜÒDZíÒÇÆ÷¶¼ÊDzÉÓÃRTUģʽµÄModbus¹æÔ¼¡£
ÐÅÏ¢´«ÊäΪÒì²½·½Ê½£¬²¢ÒÔ×Ö½ÚΪµ¥Î»¡£ÔÚÖ÷Õ¾ºÍ´ÓÕ¾Ö®¼ä´«µÝµÄͨѶ±¨ÎĵÄÐÅÏ¢Ö¡¸ñʽÈç±í1Ëùʾ¡£
ModbusRTU²ÉÓÃÖ÷´Ó·½Ê½£¬ÈôÖ÷»úÉ豸·¢ËÍÒ»¸öÐÅÏ¢£¬Ôò¿É´Óһ̨´Ó»úÉ豸·µ»ØÒ»¸öÏìÓ¦£¬ÀàËƵģ¬µ±Ò»Ì¨´Ó»úÉ豸½ÓÊÜÐÅϢʱ£¬Ëü¾Í×éÖ¯Ò»¸ö´Ó»úÉ豸µÄÏìÓ¦ÐÅÏ¢£¬²¢·µ»ØÖÁÔ·¢ËÍÐÅÏ¢µÄÖ÷»úÉ豸¡£
µ±Í¨Ñ¶ÃüÁîÓÉÖ÷»ú·¢ËÍÖÁ´Ó»úʱ£¬·ûºÏÏàÓ¦µØÖ·ÂëµÄ´Ó»ú½ÓÊÕͨѶÃüÁ²¢¸ù¾Ý¹¦ÄÜÂë¼°Ïà¹ØÒªÇó¶ÁÈ¡ÐÅÏ¢£¬Èç¹ûCRCУÑéÎÞÎó£¬ÔòÖ´ÐÐÏàÓ¦µÄÈÎÎñ£¬È»ºó°ÑÖ´Ðнá¹û·µË͸øÖ÷»ú¡£
±í1 Modbus RTUÐÅÏ¢Ö¡¸ñʽ
Modbus RTUµÄ²éѯÏìÓ¦ÖÜÆÚÈçͼ1Ëùʾ¡£
3.1Ö÷Ìå¼Ü¹¹
Èí¼þ²ÉÓÃÁ½¸öỊ̈߳¬Ö÷Ïß³ÌÏÔʾÖ÷½çÃ棬ÓÃÀ´ÉèÖÃÊý¾Ý¡£±¨ÎÄ´¦ÀíÏß³ÌÓÃÀ´¼àÌý±¨ÎÄÖ¡¡¢·ÖÎö±¨ÎÄ¡¢È¡³öÖ÷½çÃæÉèÖõÄÊý¾Ý²¢´ò°ü×÷³ö»ØÓ¦[6l¡£
¶ÔÓÚ¸÷²¿·ÖµÄ¹¦ÄÜÓÃÀà½øÐзâ×°´¦Àí£¬Á¦Çóʹ³ÌÐò¼ò½àÒ׶®¡¢±ãÓÚÒÆÖ²¡£³ÌÐòÖÐËùÓõĸ÷ÖÖÄ£¿éÈçÏÂ[7£¬8]£º
(1)Ïß³ÌÎÊÊý¾Ý´«ËÍÄ£¿é£ºÓÃÓÚÖ÷Ïß³ÌÓë×ÓÏ̼߳䴫ËÍÖ÷½çÃæËùÉèÖõÄÊý¾Ý£¬²ÉÓÃÈ«¾Ö±äÁ¿½øÐÐÏ̼߳äͨÐÅ£¬Ê¹Óû¥³âÌå(CMutex)½øÐÐÏß³Ìͬ²½¡£
(2)´®¿ÚÊý¾ÝÊÕ·¢Ä£¿é£ºÓÃÓÚ´®¿Ú´ò¿ª¡¢¹Ø±ÕµÈ³£ÓòÙ×÷¼°´®¿ÚÊý¾ÝµÄÊÕ·¢£¬Îª±£Ö¤´®¿ÚÊÕ·¢Ä£¿éµÄÁé»îÐÔ£¬Ä£¿éÖд®¿ÚÊý¾ÝµÄÊÕ·¢³ÌÐò²ÉÓÃÁË´®¿Ú²Ù×÷Ïà¹ØµÄWindowsAPIº¯Êý¡£
(3)ModbusÐÒéÄ£¿é£º¶Ô´®¿ÚÊý¾ÝÊÕ·¢Ä£¿éÔٴηâ×°²¢ÊµÏÖÁËModbusR£¬rUµÄ¸÷ÖÖ±¨ÎĹ淶¡£¶¨ÒåÁ˱¨ÎĸñʽµÄÁ½Öֽṹ¡ª¡ªPDU(ÐÒéÊý¾Ýµ¥Ôª)ºÍADU(Ó¦ÓÃÊý¾Ýµ¥Ôª)£¬¼°Á½ÕßÏ໥ת»¯µÄ·½·¨¡£²¢ÔÚ´Ë»ù´¡ÉÏʵÏÖÁ˶ԽÓÊܱ¨ÎĵÄÅжϽâÎöºÍ¶ÔÓû·¢Ëͱ¨ÎÄ×éÖ¯´ò°ü¡£
(4)CRCУÑéÄ£¿é£ºÓÃÓÚÉú³É·¢Ëͱ¨ÎĵÄ16λCRCУÑéÂ룬²¢¶Ô½ÓÊܵı¨ÎÄÔÙ´ÎÉú³ÉCRCУÑéÂëÒÔ±ãÓÚÓëÔУÑéÂë½øÐбȶԡ£
±¨ÎÄ´¦ÀíÏ̵߳ÄÁ÷³ÌͼÈçͼ2Ëùʾ¡£
3.2±¨ÎÄÊý¾ÝµÄ´æ´¢¼°¹ÜÀí
ΪÁË´æ´¢±¨ÎÄÖеÄÊý¾Ý£¬ÔÚÄÚ´æÖл®·Ö³öÀ´Ò»¸ö256Bytes´óСµÄ±¨ÎÄ»º³åÇø¡£ÊÕµ½µÄ±¨Îĺʹò°üºÃµÄ±¨ÎĶ¼ÔÝ´æÔÚ¸ÃÇøÓòÖС£Ò²¾ÍÊÇ˵¶Ô±¨ÎĵĽâÎöºÍ´ò°ü¾Í±ä³ÉÁ˶Ա¨ÎÄ»º³åÇøµÄ²Ù×÷[9£¬10]¡£ÎªÁ˸üºÃµØ¹ÜÀí±¨ÎÄ»º³åÇø£¬¶¨ÒåÁËÁ½¸ö½á¹¹PDUÒ»HANDLEÄ£ÄâÊÇPDU(±¨ÎÄÊý¾Ýµ¥Ôª)£¬ÆäÖÐPDU¡ªHANDLEÄ£ÄâµÄÊÇPDU(±¨ÎÄÊý¾Ýµ¥Ôª)£¬ADUÒ»CONTROIÄ£ÄâµÄÊÇADU(ÐÒéÊý¾Ýµ¥Ôª)[11l¡£¶þÕ߶¨ÒåÈçÏ£º
struet PDU¡ªHANDLE
{
unsignedchar*PDUBuffPtr;//PUDÊý¾ÝÖ¸Õë
urlsigned
char FunctionCode;//ÇëÇó¹¦ÄÜ´úÂë
umigrled$l'92rt PD¡ëh;//PDU×Ö½Ú³¤¶È
unsigned
char ExeeptiongÏõe;//Òì³£´úÂë
};
Sta"uct ADU_CONTROL£¬
{
unsigned char*ADUBuffPtr;//ADU»º³åÇøÖ¸Õ룬ָÏò±¨ÎÄ»º³åÇø
unsigned char ADULength;//É豸µØÖ·
unsigned short ADULength;//ADU×Ö½Ú³¤¶È
};
¶ÔPDU_HANDIEºÍADU_CONTROL²Ù×÷µÄº¯ÊýÖ÷ÒªÓÐPackDU2PDU()¡¢ClearPDUBuf()¡¢PackP_DU2ADU()¡£ÆäÖ÷ÒªÁ÷³ÌÊÇ£º
1)ÊÕµ½ºÏ·¨µÄ±¨Îĺ󣬶ԽṹADU-CONTROL½øÐÐÌî³ä¡£±¨Îı»´æ´¢ÔÚADU¡ªCoNTROLµÄ³ÉÔ±ADÇÐ3uffPtrÖ¸ÏòµÄÄÚ´æµ¥ÔªÖС£±¨ÎÄÆäËüÏà¹ØÐÅÏ¢(´Ó»úµØÖ·£¬±¨Îij¤¶È)Ìî³äµ½ADU¡ªCONTRoI.µÄÊ£Óà³ÉÔ±ÖС£
2)Ö´ÐÐPackADU2PDU()¡£Íê³ÉADUÏòPDUµÄת»»¡£´Ë²½Ö÷ÒªÍê³ÉCRCl6УÑéÂë±È¶Ô£¬²¢ÒÀ¾ÝADU¡ªCONTRoIµÄ³ÉÔ±Íê³É¶ÔPDU_HANDLEµÄÌî³ä£¬ÒÔ±ãÓÚºóÐø¶ÔPDUÄÚÈݵķÖÎö´¦Àí¡£
3)Ö´ÐÐClearPDUBuf() £¬Çå¿ÕPDUÊý¾Ý»º³åÇøÄÚÈÝ¡£´ËʱÒѾÍê³É¶Ô½ÓÊܱ¨ÎĵķÖÎö£¬ÒªÇå¿ÕPDUÊý¾Ý»º³åÇøÄÚÈÝ.ÒÔ×°ÌîÓû·¢Ë͵ÄPDUÊý¾Ý¡£
4)Ö´ÐÐPackPDU2ADU()¡£Ê¹PDUÍ·²¿¼ÓÉÏÉ豸µØÖ·£¬Î²²¿¸½¼ÓCRcl6УÑéÂë¡£´Ëʱ·â×°³ÉÁËÍêÕûµÄ±¨ÎÄ£¬ÒԱ㷢ËÍ¡£
3.3¹¦ÄÜÂë¼°ÏàÓ¦´¦Àíº¯Êý±¾³ÌÐò¶Ô²»Í¬µÄ¹¦ÄÜÂëÉèÖÃÁ˲»Í¬µÄ´¦Àíº¯Êý¡£
³öÁ˲¿·Ö±ê×¼¹¦ÄÜÂë¼°ÏàÓ¦µÄ´¦Àíº¯Êý¡£Modbusµ÷ÊÔÈí¼þÒ»°ã×÷Ϊ´Ó»ú¡£¶ÔÖ÷»ú·¢À´µÄ·ûºÏModbusÐÒéµÄ±¨ÎĽøÐнâÎö»ØÓ¦¡£ÆÕͨµÄModbusµ÷ÊÔÈí¼þÒ»°ãÖ»ÄܶÔÉÏÊöËÄÖÖ±ê×¼¹¦ÄÜÂë½øÐнâÎö»ØÓ¦¡£µ«ÊǶÔÓÚʵ¼ÊµÄModbusÉ豸À´Ëµ¡£ÕâËÄÖÖ¹¦ÄÜÂëÊÇÔ¶Ô¶²»¹»µÄ£¬¸ü¶àµÄʱºòÐèÒª×Ô¶¨Ò幦ÄÜÂëÀ´Íê³ÉÏà¹ØµÄ¹¦ÄÜ¡£ÎªÁËÍê³É¶Ô×Ô¶¨Ò幦ÄÜÂëµÄµ÷ÊÔ¡£¿ÉÒÔÔÚµ÷ÊÔÈí¼þÖмÓÈë×Ô¶¨Ò幦ÄÜÂë´¦Àíº¯Êý¡£ÕâÑù±ã¿ÉÒÔʹ´Ë³ÌÐòÓиüÇ¿µÄÕë¶ÔÐÔ[7]¡£
±í2²¿·Ö±ê×¼Modbus¹¦ÄÜÂë¼°Æä´¦Àíº¯Êý
¹¦ÄÜÂë | ¶ÔÓ¦º¯Êý | ¹¦ÄÜÃèÊö |
0x01 | ReadCoils | ¶ÁÏßȦ |
0x02 | ReadDiscretlnputs | ¶ÁÀëÉ¢ÊäÈëÁ¿ |
0x03 | ReadHoldReg | ¶Á±£³Ö¼Ì´æÆ÷ |
0x04 | ReadInputReg | ¶ÁÊäÈë¼Ì´æÆ÷ |
3.4³ÌÐòµÄ½çÃæ
ͼ3ËùʾΪMoDbusRTU´®ÈÕµ÷ÊÔÈí¼þµÄÖ÷½çÃ档ͼ4ΪÉÏλ»úÈí¼þÓëModbosRTU´®¿Úµ÷ÊÔÈí¼þµÄͨÐŽçÃæ¡£¿ÉÒÔ¿´³ö¸ÃModbus RTUµ÷ÊÔÈí¼þ¹¤×÷Õý³£¡£
ͼ3 ModbusRTU´®¿Úµ÷ÊÔÈí¼þ½çÃæ
ͼ4ÉÏλ»úÈí¼þÓëModbusRTU´®¿Úµ÷ÊÔÈí¼þµÄͨÐŽçÃæ
ÀûÓÃÉÏÊö·½·¨£¬ÔÚVC2005»·¾³Ï±àÖƵĻùÓÚModbusRTUµÄ´®¿Úµ÷ÊÔÈí¼þ£¬ÔÚij×Ô¶¯»¯ÆóҵСÐÍPLCÑз¢ÏîÄ¿µÄÉÏλ»úÓëÏÂλ»úͨÐŵ÷ÊÔÖеõ½Ó¦Ó᣼ÈÄܶԱê×¼Modbus¹¦ÄÜÂë½øÐе÷ÊÔ£¬Ò²¿É¶Ô×Ô¶¨Ò幦ÄÜÂë½øÐе÷ÊÔ¡£Êµ¼ùÖ¤Ã÷³ÌÐòÔËÐÐÎȶ¨¡¢¿É¿¿£¬²Ù×÷¼ò±ã¡¢Ò×ÐС£Îª×Ô¶¨Ò幦ÄÜÂëµÄModbus RTU´®¿Úµ÷ÊÔÌṩÁËÒ»Ìõ¼ò½à¡¢¿ÉÐеĽâ¾ö·½·¨¡£