#ifndef PERFORMANCE_MELSEC_H #define PERFORMANCE_MELSEC_H #include #include #include #include #include #include #include #include // Á¬½Ó²ÎÊý #define PLC_MAX_RETRY 3 // ×î´óÖØÊÔ´ÎÊý£ºÔÚÓëPLCͨÐÅʱ£¬Èç¹û·¢ÉúͨÐÅ´íÎ󣬽«×î¶àÖØÊÔ3´Î #define PLC_TIMEOUT 500 // ³¬Ê±Ê±¼ä£¨ºÁÃ룩£ºÃ¿´ÎͨÐŲÙ×÷µÄ³¬Ê±µÈ´ýʱ¼äΪ500ºÁÃë /* * ÍøÂçͨµÀ£ºÖ¸¶¨Í¨ÐÅËùʹÓõÄÍøÂçͨµÀºÅ£¬Í¨³£ÔÚ¶àͨµÀͨÐÅÖÐÉèÖà * 51 µ½ 54 ÊÇ MELSECNET/H µÄ 1-4 ͨµÀ * 81 µ½ 84 ÊÇ CC-Link µÄ 1-4 ͨµÀ * 151 µ½ 154 ÊÇ CC-Link IE ¿ØÖÆÆ÷ÍøÂçµÄ 1-4 ͨµÀ * 181 µ½ 184 ÊÇ CC-Link IE ÏÖ³¡ÍøÂçµÄ 1-4 ͨµÀ * 281 µ½ 284 ÊÇ CC-Link IE TSN ÍøÂçµÄ 1-4 ͨµÀ **/ #define MELSECNET_CHANNEL(x) (50 + (x)) // x ·¶Î§£º1~4 #define CC_LINK_CHANNEL(x) (80 + (x)) // x ·¶Î§£º1~4 #define CC_LINK_IE_CONTROL_CHANNEL(x) (150 + (x)) // x ·¶Î§£º1~4 #define CC_LINK_IE_FIELD_CHANNEL(x) (180 + (x)) // x ·¶Î§£º1~4 #define CC_LINK_IE_TSN_CHANNEL(x) (280 + (x)) // x ·¶Î§£º1~4 // ×Ô¶¨Òå´íÎóÂë #define ERROR_CODE_UNKNOWN 0x00010000 // δ֪ #define ERROR_CODE_NOT_CONNECTED 0x00020000 // δÁ¬½Ó #define ERROR_CODE_INVALID_PARAM 0x00030000 // ²ÎÊýÎÞЧ #define ERROR_CODE_INVALID_DATA 0x00040000 // Êý¾ÝÎÞЧ #define ERROR_CODE_STATION_OUT_OF_RANGE 0x00050000 // Õ¾ºÅ³¬³ö·¶Î§ #define ERROR_CODE_GROUP_OUT_OF_RANGE 0x00060000 // ×éºÅ³¬³ö·¶Î§ #define ERROR_CODE_NETWORK_OUT_OF_RANGE 0x00070000 // ÍøÂçºÅ³¬³ö·¶Î§ // °å¿éÀàÐÍ enum class BoardType { UNKNOWN = -1, // δ֪ÀàÐÍ MELSECNET_H = MELSECNET_CHANNEL(1), // MELSECNET/H CC_LINK_VER_2 = CC_LINK_CHANNEL(1), // CC-Link Ver. 2 CC_LINK_IE_CONTROL = CC_LINK_IE_CONTROL_CHANNEL(1), // CC-Link IE ¿ØÖÆÍøÂç CC_LINK_IE_FIELD = CC_LINK_IE_FIELD_CHANNEL(1), // CC-Link IE ÏÖ³¡ÍøÂç CC_LINK_IE_TSN = CC_LINK_IE_TSN_CHANNEL(1) // CC-Link IE TSN }; // ÈíÔª¼þÀàÐÍö¾Ù enum class DeviceType { /* * ER¡¢LX¡¢LY¡¢LB¡¢LW¡¢LSB¡¢LSWºÍSPGÈíÔª¼þ¶¼ÊÇ·¶Î§ÐÍ * ER£ºDevER0¡«256 * LX£ºDevLX1¡«255£¬DevLX(x) (DevX*1000+(x)) * LY£ºDevLY1¡«255£¬DevLY(x) (DevY*1000+(x)) * LB£ºDevLB1¡«255£¬DevLB(x) (DevB*1000+(x)) * LW£ºDevLW1¡«255£¬DevLW(x) (DevW*1000+(x)) * LSB£ºDevLSB1¡«255£¬DevLSB(x) (DevQSB*1000+(x)) * LSW£ºDevLSW1¡«255£¬DevLSW(x) (DevQSW*1000+(x)) * SPG£ºDevSPG0¡«255£¬DevSPG(x) (29*1000+(x)) * À©Õ¹Îļþ¼Ä´æÆ÷´úÂëÖ¸¶¨(10½øÖÆÊý)µÄºó3λÊý¼°ÈíÔª¼þÃûÖ¸¶¨µÄÊýÖµÖУ¬Ó¦Ö¸¶¨¿éNo.(0¡«256) * Á´½ÓÖ±½ÓÈíÔª¼þ´úÂëÖ¸¶¨(10½øÖÆÊý)µÄºó3λÊý¼°ÈíÔª¼þÃûÖ¸¶¨µÄÊýÖµÖУ¬Ó¦Ö¸¶¨ÍøÂçNo.(1¡«255) * ÖÇÄܹ¦ÄÜÄ£¿éÈíÔª¼þ´úÂëÖ¸¶¨(10½øÖÆÊý)µÄºó3λÊý¼°ÈíÔª¼þÃûÖ¸¶¨µÄÊýÖµÖУ¬Ó¦Ö¸¶¨(ÆðʼI/ONo.¡Â16)µÄÖµ * À©Õ¹Îļþ¼Ä´æÆ÷ºÍÁ´½ÓÖ±½ÓÈíÔª¼þÔÚËæ»ú¶ÁÈ¡(mdRandR¡¢mdRandREx)º¯ÊýÖУ¬¼´Ê¹Ö¸¶¨Êµ¼Ê²»´æÔÚµÄÈíÔª¼þÒ²ÓпÉÄÜÕý³£½áÊø * MAILºÍMAILMCÔÚSEND¹¦Äܼ°RECV¹¦ÄÜÖУ¬ÓëÈíÔª¼þ·ÃÎÊÒ»Ñù£¬Ö¸¶¨¸÷¹¦ÄܶÔÓ¦µÄÈíÔª¼þÀàÐÍ£¬½øÐÐÊý¾ÝµÄ·¢ËÍ(mdSend¡¢mdSendEx)»òÊý¾ÝµÄ¶ÁÈ¡(mdReceive¡¢mdReceiveEx) **/ X = 0x0001, // ÊäÈë (λ) Y = 0x0002, // Êä³ö (λ) L = 0x0003, // Ëø´æ¼ÌµçÆ÷ (λ) M = 0x0004, // ÄÚ²¿¼ÌµçÆ÷ (λ) SM = 0x0005, // ÌØÊâ¼ÌµçÆ÷ (λ) F = 0x0006, // ±¨¾¯Æ÷ (λ) TT = 0x0007, // ¶¨Ê±Æ÷ (´¥µã) (λ) TC = 0x0008, // ¼ÆÊýÆ÷ (ÏßȦ) (λ) CT = 0x0009, // ¼ÆÊýÆ÷ (´¥µã) (λ) CC = 0x000A, // ¼ÆÊýÆ÷ (ÏßȦ) (×Ö) TN = 0x000B, // ¶¨Ê±Æ÷ (µ±Ç°Öµ) (×Ö) CN = 0x000C, // ¼ÆÊýÆ÷ (µ±Ç°Öµ) (×Ö) D = 0x000D, // Êý¾Ý¼Ä´æÆ÷ (×Ö) SD = 0x000E, // ÌØÊâ¼Ä´æÆ÷ (×Ö) TM = 0x000F, // ¶¨Ê±Æ÷ (ÉèÖÃÖµÖ÷) (×Ö) TS = 0x0010, // ¶¨Ê±Æ÷ (ÉèÖÃÖµÖ÷1) (×Ö) TS2 = 0x3E82, // ¶¨Ê±Æ÷ (ÉèÖÃÖµÖ÷2) (×Ö) TS3 = 0x3E83, // ¶¨Ê±Æ÷ (ÉèÖÃÖµÖ÷3) (×Ö) CM = 0x0011, // ¼ÆÊýÆ÷ (ÉèÖÃÖµÖ÷) (×Ö) CS = 0x0012, // ¼ÆÊýÆ÷ (ÉèÖÃÖµÖ÷1) (×Ö) CS2 = 0x4652, // ¼ÆÊýÆ÷ (ÉèÖÃÖµÖ÷2) (×Ö) CS3 = 0x4653, // ¼ÆÊýÆ÷ (ÉèÖÃÖµÖ÷3) (×Ö) A = 0x0013, // ÀÛ¼ÓÆ÷ (×Ö) Z = 0x0014, // ±äÖ·¼Ä´æÆ÷ (×Ö) V = 0x0015, // ±äÖ·¼Ä´æÆ÷ (×Ö) R = 0x0016, // Îļþ¼Ä´æÆ÷ (¿éÇл»·½Ê½) (×Ö) ER = 0x55F0, // À©Õ¹Îļþ¼Ä´æÆ÷ (¿éÇл»·½Ê½) (0x55F0¡«0x56F0) (×Ö) (ÔÚËæ»ú¶ÁÈ¡(mdRandR¡¢mdRandREx)º¯ÊýÖУ¬¼´Ê¹Ö¸¶¨Êµ¼Ê²»´æÔÚµÄÈíÔª¼þÒ²ÓпÉÄÜÕý³£½áÊø¡£(¶ÁÈ¡Êý¾Ý²»ÕýÈ·¡£)) ZR = 0x00DC, // Îļþ¼Ä´æÆ÷ (Á¬ºÅ·ÃÎÊ·½Ê½) (×Ö) B = 0x0017, // Á´½Ó¼ÌµçÆ÷ (λ) W = 0x0018, // Á´½Ó¼Ä´æÆ÷ (×Ö) QSB = 0x0019, // Á´½ÓÌØÊâ¼ÌµçÆ÷ (λ) STT = 0x001A, // Àۼƶ¨Ê±Æ÷ (´¥µã) (λ) STC = 0x001B, // Àۼƶ¨Ê±Æ÷ (ÏßȦ) (λ) QSW = 0x001C, // Á´½ÓÌØÊâ¼Ä´æÆ÷ (×Ö) QV = 0x001E, // ±äÖ·¼ÌµçÆ÷ (λ) MRB = 0x0021, // Ëæ»ú·ÃÎÊ»º³å (×Ö) STN = 0x0023, // Àۼƶ¨Ê±Æ÷ (µ±Ç°Öµ) (×Ö) LZ = 0x0026, // ³¬³¤±äÖ·¼Ä´æÆ÷ (Ë«×Ö) RD = 0x0027, // Ë¢ÐÂÊý¾Ý¼Ä´æÆ÷ (×Ö) LTT = 0x0029, // ³¬³¤¶¨Ê±Æ÷ (´¥µã) (λ) LTC = 0x002A, // ³¬³¤¶¨Ê±Æ÷ (ÏßȦ) (λ) LTN = 0x002B, // ³¬³¤¶¨Ê±Æ÷ (µ±Ç°Öµ) (Ë«×Ö) LCT = 0x002C, // ³¬³¤¼ÆÊýÆ÷ (´¥µã) (λ) LCC = 0x002D, // ³¬³¤¼ÆÊýÆ÷ (ÏßȦ) (λ) LCN = 0x002E, // ³¬³¤¼ÆÊýÆ÷ (µ±Ç°Öµ) (Ë«×Ö) LSTT = 0x002F, // ³¬³¤Àۼƶ¨Ê±Æ÷ (´¥µã) (λ) LSTC = 0x0030, // ³¬³¤Àۼƶ¨Ê±Æ÷ (ÏßȦ) (λ) LSTN = 0x0031, // ³¬³¤Àۼƶ¨Ê±Æ÷ (µ±Ç°Öµ) (Ë«×Ö) SPB = 0x0032, // »º³å´æ´¢Æ÷ (×Ö) MAIL = 0x0065, // ÌØÊâÈíÔª¼þÀàÐÍ£ºÓʼþÀàÐÍ (10½øÖÆ 101) MAILMC = 0x0066, // ÌØÊâÈíÔª¼þÀàÐÍ£ºÎÞÈ·ÈÏÓʼþ (10½øÖÆ 102) LX = 0x03E8, // Á´½ÓÖ±½ÓÈíÔª¼þ (Á´½ÓÊäÈë) (0x03E9¡«0x04E7) (λ) LY = 0x07D0, // Á´½ÓÖ±½ÓÈíÔª¼þ (Á´½ÓÊä³ö) (0x07D1¡«0x08CF) (λ) LB = 0x59D8, // Á´½ÓÖ±½ÓÈíÔª¼þ (Á´½Ó¼ÌµçÆ÷) (0x59D9¡«0x5AD7) (λ) LW = 0x5DC0, // Á´½ÓÖ±½ÓÈíÔª¼þ (Á´½Ó¼Ä´æÆ÷) (0x5DC1¡«0x5EBF) (×Ö) LSB = 0x61A8, // Á´½ÓÖ±½ÓÈíÔª¼þ (Á´½ÓÌØÊâ¼ÌµçÆ÷) (0x61A9¡«0x62A7) (λ) LSW = 0x6D60, // Á´½ÓÖ±½ÓÈíÔª¼þ (Á´½ÓÌØÊâ¼Ä´æÆ÷) (0x6D61¡«0x6E5F) (×Ö) SPG = 0x7147, // ÖÇÄܹ¦ÄÜÄ£¿éÈíÔª¼þ (0x7148¡«0x7247) (×Ö) }; // Êý¾ÝÀàÐÍ enum class DataType { BIT = 1, // λ (1λ) WORD = 2, // ×Ö (16λ) DWORD = 4 // Ë«×Ö (32λ) }; // ¿ØÖÆ´úÂë enum class ControlCode { RUN = 0, // Ô¶³Ì RUN STOP = 1, // Ô¶³Ì STOP PAUSE = 2 // Ô¶³Ì PAUSE }; // °æ±¾ÐÅÏ¢ struct BoardVersion { char fixedValue[2]; // ¹Ì¶¨Öµ char checksum[2]; // УÑéºÍ char swVersion[2]; // Èí¼þ°æ±¾ char date[6]; // ÈÕÆÚ (¸ñʽ YYMMDD) uint32_t reserved; // ±£ÁôÇøÓò (4 ×Ö½Ú) char swModel[16]; // Èí¼þÐͺŠchar hwModel[16]; // Ó²¼þÐͺŠchar twoPortMemory[2]; // Á½¶Ë¿Ú´æ´¢Æ÷Õ¼ÓÃÈÝÁ¿ char twoPortAttribute[2]; // Á½¶Ë¿ÚÊôÐÔ char availableBias[2]; // ¿ÉʹÓÃÆ«Öà char moduleType[10]; // »úÐÍÀàÐÍ // Êä³ö½á¹¹ÌåÄÚÈÝΪ×Ö·û´® (±ãÓÚµ÷ÊÔ) std::string toString() const { std::ostringstream oss; oss << "Fixed Value: " << fixedValue[0] << fixedValue[1] << "\n" << "Checksum: " << checksum[0] << checksum[1] << "\n" << "SW Version: " << swVersion[0] << swVersion[1] << "\n" << "Date: " << std::string(date, 6) << "\n" << "Reserved: " << reserved << "\n" << "SW Model: " << std::string(swModel, 16) << "\n" << "HW Model: " << std::string(hwModel, 16) << "\n" << "Two Port Memory: " << twoPortMemory[0] << twoPortMemory[1] << "\n" << "Two Port Attribute: " << twoPortAttribute[0] << twoPortAttribute[1] << "\n" << "Available Bias: " << availableBias[0] << availableBias[1] << "\n" << "Module Type: " << std::string(moduleType, 10) << "\n"; return oss.str(); } }; // Õ¾µã±êʶ·û£¬Ä¬ÈÏʹÓñ¾Õ¾ struct StationIdentifier { /* * [Network No.] * 0 ±íʾ±¾Õ¾ * 1~239 ±íʾÆÕÍ¨ÍøÂçºÅ **/ /* * [Station No.] * MELSECNET/H£º1~64 ±íʾÆäËûÕ¾µã£¬255 ±íʾ±¾Õ¾ * CC-Link ϵÁÐÍøÂçµÄ·¶Î§ÀàËÆ£¬Çø±ðÔÚÓÚÕ¾ºÅµÄȡֵ·¶Î§ * MELSECNET/H : 1~64(Other stations),255(Own station) * CC-Link : 0~63(Other stations),255(Own station) * CC-Link IE Controller : 1~120(Other stations),255(Own station) * CC-Link IE Field : 0~120(Other stations),255(Own station) * CC-Link IE TSN : 0~120(Other stations),255(Own station) **/ /* * ¸ß 8 λ£¨ÍøÂçºÅ£©£º Ö¸¶¨É豸ËùÊôµÄÍøÂç * µÍ 8 λ£¨Õ¾µãºÅ£©£º Ö¸¶¨É豸ÔÚÍøÂçÖеıàºÅ * ÓÃÒ»¸ö²ÎÊý´«µÝÉ豸µÄÍøÂçºÅºÍÕ¾µãºÅʱ: nSt = station.nStNo | ((station.nNetNo << 8) & 0xFF00); **/ short nNetNo = 0; // ÍøÂç±àºÅ£ºPLCËùÁ¬½ÓµÄÍøÂç±àºÅ£¬0±íʾĬÈÏÍøÂç short nStNo = 255; // Õ¾µã±àºÅ£ºÖ¸¶¨ÓëPLCÁ¬½ÓµÄÕ¾µã±àºÅ£¬255ͨ³£±íʾ¹ã²¥»òËùÓÐÕ¾µã // ×Ô¶¨Òå¹¹Ô캯Êý£¬¸²¸ÇĬÈÏÖµ explicit StationIdentifier(const short net, const short st) : nNetNo(net), nStNo(st) {} StationIdentifier() { nNetNo = 0; nStNo = 255; } // ½«¡°ÍøÂçºÅ¡±ºÍ¡°Õ¾µãºÅ¡±×éºÏ³ÉÒ»¸ö×îÖÕ±àÂë short StationIdentifier::toNetworkStationCode() const { return static_cast(nStNo | ((nNetNo << 8) & 0xFF00)); } // ÖØÔØ < ÔËËã·û£¨ÓÃÓÚÅÅÐò»ò±È½Ï£¬Í¨³£ÓÃÓÚ map »ò set ÖÐ×÷Ϊ key£© bool operator<(const StationIdentifier& other) const { return std::tie(nNetNo, nStNo) < std::tie(other.nNetNo, other.nStNo); } // ÖØÔØ == ÔËËã·û£¨ÓÃÓÚÏàµÈ±È½Ï£© bool operator==(const StationIdentifier& other) const { return std::tie(nNetNo, nStNo) == std::tie(other.nNetNo, other.nStNo); } // ÖØÔØ = ÔËËã·û£¨ÓÃÓÚ¸³Öµ£© StationIdentifier& operator=(const StationIdentifier& other) { if (this != &other) { nNetNo = other.nNetNo; nStNo = other.nStNo; } return *this; } }; // °å״̬ struct BoardStatus { short nStationValue = 0; // Õ¾ºÅµÄÉ豸ֵ (buf[0]) short nGroupValue = 0; // ×é No. µÄÉ豸ֵ (buf[1]) short nNetworkValue = 0; // ÍøÂç No. µÄÉ豸ֵ (buf[2]) short nReserved1 = 0; // ±£Áô×Ö¶Î (buf[3]) short nReserved2 = 0; // ±£Áô×Ö¶Î (buf[4]) short nReserved3 = 0; // ±£Áô×Ö¶Î (buf[5]) // ½«Êý×éÓ³Éäµ½½á¹¹Ìå static BoardStatus fromBuffer(const short buf[6]) { return { buf[0], buf[1], buf[2], buf[3], buf[4], buf[5] }; } // ½«½á¹¹ÌåÄÚÈÝÓ³Éäµ½Êý×é void toBuffer(short buf[6]) const { buf[0] = nStationValue; buf[1] = nGroupValue; buf[2] = nNetworkValue; buf[3] = nReserved1; buf[4] = nReserved2; buf[5] = nReserved3; } // µ÷ÊÔÊä³ö std::string toString() const { std::ostringstream oss; oss << "Station Value: " << nStationValue << "\n" << "Group Value: " << nGroupValue << "\n" << "Network Value: " << nNetworkValue << "\n" << "Reserved1: " << nReserved1 << "\n" << "Reserved2: " << nReserved2 << "\n" << "Reserved3: " << nReserved3 << "\n"; return oss.str(); } }; // ʼþÏêÇé struct EventDetails { short nEventNo; // ·¢ÉúµÄʼþºÅ std::array details; // ´æ´¢Ê¼þÏêÇéÐÅÏ¢ // ½âÎöʼþÏêÇ飬·µ»Ø¸ñʽ»¯×Ö·û´® std::string toString() const { std::ostringstream oss; oss << "Details[0]: " << details[0] << ", " << "Details[1]: " << details[1] << ", " << "Details[2]: " << details[2] << ", " << "Details[3]: " << details[3]; return oss.str(); } }; // SoftElement ½á¹¹Ì嶨Òå struct SoftElement { short nType; // ÈíÔª¼þÀàÐÍ short nElementCount; // µãÊý long nStartNo; // ÆðʼÈíÔª¼þ±àºÅ }; // ´íÎóÐÅÏ¢ struct ErrorInfo { int nErrorCode = 0; // ´íÎóÂë std::string strErrorMessageCn; // ÖÐÎÄÃèÊö std::string strErrorMessageEn; // Ó¢ÎÄÃèÊö // ½«½á¹¹ÌåÐòÁл¯Îª×Ö·û´® std::string toString() const { std::ostringstream oss; oss << nErrorCode << "|" << strErrorMessageCn << "|" << strErrorMessageEn; return oss.str(); } // ´Ó×Ö·û´®·´ÐòÁл¯Îª½á¹¹Ìå static ErrorInfo fromString(const std::string& line) { ErrorInfo info; std::istringstream iss(line); std::string token; // ʹÓ÷ָô·û "|" ½âÎö×Ö·û´® std::getline(iss, token, '|'); info.nErrorCode = std::stoi(token); std::getline(iss, token, '|'); info.strErrorMessageCn = token; std::getline(iss, token, '|'); info.strErrorMessageEn = token; return info; } }; using BitContainer = std::vector; // ÿ¸öÔªËØ´æ´¢ 1 λ using WordContainer = std::vector; // ÿ¸öÔªËØ´æ´¢ 16 λ using DWordContainer = std::vector; // ÿ¸öÔªËØ´æ´¢ 32 λ // CPerformanceMelsec ÀàÉùÃ÷ class CPerformanceMelsec { public: // »ñÈ¡×î½üµÄ´íÎóÐÅÏ¢ std::string GetLastError() const; // ´íÎóÐÅÏ¢¼ÓÔØÓë±£´æ½Ó¿Ú static bool LoadErrorInfoFromFile(const std::string& filename); // ´ÓÎļþ¼ÓÔØ´íÎóÐÅÏ¢ static bool SaveErrorInfoToFile(const std::string& filename); // ±£´æ´íÎóÐÅÏ¢µ½Îļþ // Á¬½Ó/¶Ï¿ª int Connect(short nChannel, short nMode = -1); int Disconnect(); // ³õʼ»¯¿É±à³Ì¿ØÖÆÆ÷ÈíÔª¼þÐÅÏ¢±í int InitializeController(); // »ñÈ¡°æ±¾ÐÅÏ¢ int GetBoardVersion(BoardVersion& version); // °å¸´Î» int BoardReset(); // °åLED¶ÁÈ¡ int ReadBoardLed(std::vector& vecLedBuffer); // ¶ÁȡĿ±êÕ¾µãCPUÀàÐÍ int ReadCPUCode(const StationIdentifier& station, short& nCPUCode); // °åģʽ»ñÈ¡/ÉèÖà int SetBoardMode(short nMode); int GetBoardMode(short& nMode); // »ñÈ¡°å״̬ int GetBoardStatus(BoardStatus& status); // ¶ÁдÊý¾Ý int ReadData(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, std::vector& vecData); int ReadBitData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, short nBitCount, BitContainer& vecData); int ReadWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, short nWordCount, WordContainer& vecData); int ReadDWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, short nDWordCount, DWordContainer& vecData); int WriteData(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, short* pData); int WriteBitData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, const BitContainer& vecData); int WriteWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, const WordContainer& vecData); int WriteDWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, const DWordContainer& vecData); // À©Õ¹¶ÁдÊý¾Ý long ReadDataEx(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, std::vector& vecData); long ReadBitDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nBitCount, BitContainer& vecData); long ReadWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nWordCount, WordContainer& vecData); long ReadDWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nDWordCount, DWordContainer& vecData); long WriteDataEx(const StationIdentifier& station, long nDevType, long nDevNo, const std::vector& vecData); long WriteBitDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const BitContainer& vecData); long WriteWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const WordContainer& vecData); long WriteDWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const DWordContainer& vecData); // À©Õ¹ÈíÔª¼þËæ»ú¶Áд£¨Ö§³Ö¶à¸öÈíÔª¼þ£© long ReadRandomDataEx(const StationIdentifier& station, const std::vector& vecSoftElements, std::vector& vecData); long WriteRandomDataEx(const StationIdentifier& station, const std::vector& vecSoftElements, const std::vector& vecData); // Ô¶³ÌÉ豸վ/Ô¶³ÌÕ¾µÄ»º³å´æ´¢Æ÷¶Áд long ReadRemoteBuffer(const StationIdentifier& station, long nOffset, long nSize, std::vector& vecData); long WriteRemoteBuffer(const StationIdentifier& station, long nOffset, const std::vector& vecData); long ReadRemoteBufferByIp(const std::string& strIP, long nOffset, long nSize, std::vector& vecData); long WriteRemoteBufferByIp(const std::string& strIP, long nOffset, const std::vector& vecData); // ÉèÖÃ/¸´Î»¶ÔÏóÕ¾µÄÖ¸¶¨Î»ÈíÔª¼þ int SetBitDevice(const StationIdentifier& station, DeviceType enDevType, short nDevNo); int ResetBitDevice(const StationIdentifier& station, DeviceType enDevType, short enDevNo); // À©Õ¹ÉèÖÃ/¸´Î»¶ÔÏóÕ¾µÄÖ¸¶¨Î»ÈíÔª¼þ long SetBitDeviceEx(const StationIdentifier& station, long nDevType, long nDevNo); long ResetBitDeviceEx(const StationIdentifier& station, long nDevType, long nDevNo); // Ö´ÐжÔÏóÕ¾µÄCPU int ControlCPU(const StationIdentifier& station, ControlCode enControlCode); // ʼþµÈ´ý£¬vecEventNumbers[0, 64]£¬nTimeoutMs[-1, 2147483647] // ͬʱ·¢ÉúÁ˶à¸öʼþµÄÇé¿öÏ£¬Ê×Ïȼì²â³öÆäÖÐÒ»¸öʼþ¡£ ÔÙ´ÎÖ´ÐÐÁ˱¾º¯ÊýµÄÇé¿öϼì²â³öÆäËüʼþ¡£ int WaitForBoardEvent(std::vector vecEventNumbers, int nTimeoutMs, EventDetails& details); private: // Ëø¶¨Óë½âËø£¨¶àÏß³Ìͬ²½±£»¤£© void Lock() { m_mtx.lock(); } void Unlock() { m_mtx.unlock(); } protected: // ¹¹Ô캯Êý/Îö¹¹º¯Êý explicit CPerformanceMelsec(BoardType enBoardType); virtual ~CPerformanceMelsec(); // ¸¨Öúº¯Êý void UpdateLastError(int nCode); // ¸üÐÂ×î½üµÄ´íÎóÐÅÏ¢ int ValidateStation(const StationIdentifier& station) const; // ¼ì²éÁ¬½Ó״̬ºÍÕ¾µã²ÎÊýÓÐЧÐÔ int ValidateStationAndSize(const StationIdentifier& station, short nCount) const; // ¾²Ì¬¸¨Öúº¯Êý static void Delay(unsigned int nDelayMs); // ÑÓʱ£¬²¢ÇÒת·¢´°¿ÚÏûÏ¢ static BoardType FindBoardTypeByChannel(int nChannel); // ²éÕÒ°å¿éÀàÐÍ static short CombineStation(const StationIdentifier& station); // ºÏ²¢ÍøÂçºÅºÍÕ¾µãºÅ static short CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType); // ¼ÆËãÈíÔª¼þÀàÐÍ // IPת»» static bool ConvertIpStringToUint32(const std::string& strIP, uint32_t& nIP); // ÈÝÆ÷ת»» static void ConvertCharToShort(const std::vector& vecChar, std::vector& vecShort); static void ConvertShortToChar(const std::vector& vecShort, std::vector& vecChar); static void ConvertUint8ToShort(const std::vector& vecUint8, std::vector& vecShort); static void ConvertShortToUint8(const std::vector& vecShort, std::vector& vecUint8); static void ConvertUint32ToShort(const std::vector& vecUint32, std::vector& vecShort); static void ConvertShortToUint32(const std::vector& vecShort, std::vector& vecUint32); // Ä£°å¸¨Öúº¯Êý template int ValidateStationAndData(const StationIdentifier& station, const std::vector& vecData); template void ConvertLowToHigh(const std::vector& vecLow, std::vector& vecHigh); template void ConvertHighToLow(const std::vector& vecHigh, std::vector& vecLow); // ³ÉÔ±±äÁ¿ std::mutex m_mtx; // »¥³âËø±£»¤ BoardType m_enBoardType; // °å¿éÀàÐÍ long m_nPath; // ͨÐÅ·¾¶ std::atomic m_bConnected; // ÊÇ·ñÒÑÁ¬½Ó std::string m_strLastError; // ×î½üÒ»´Î´íÎóÐÅÏ¢ // ¾²Ì¬³ÉÔ±±äÁ¿ static std::unordered_map m_mapError; // ´íÎóÂëÓ³Éä±í }; #endif // PERFORMANCE_MELSEC_H