#ifndef PERFORMANCE_MELSEC_H
|
#define PERFORMANCE_MELSEC_H
|
|
#include "Mdfunc.h"
|
|
#include <map>
|
#include <array>
|
#include <mutex>
|
#include <string>
|
#include <vector>
|
#include <atomic>
|
#include <sstream>
|
#include <unordered_map>
|
|
// Á¬½Ó²ÎÊý
|
#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<short>(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<short, 4> 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<bool>; // ÿ¸öÔªËØ´æ´¢ 1 λ
|
using WordContainer = std::vector<uint16_t>; // ÿ¸öÔªËØ´æ´¢ 16 λ
|
using DWordContainer = std::vector<uint32_t>; // ÿ¸öÔªËØ´æ´¢ 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<short>& 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<short>& 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<char>& 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<char>& 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<SoftElement>& vecSoftElements, std::vector<char>& vecData);
|
long WriteRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, const std::vector<char>& vecData);
|
|
// Ô¶³ÌÉ豸վ/Ô¶³ÌÕ¾µÄ»º³å´æ´¢Æ÷¶Áд
|
long ReadRemoteBuffer(const StationIdentifier& station, long nOffset, long nSize, std::vector<char>& vecData);
|
long WriteRemoteBuffer(const StationIdentifier& station, long nOffset, const std::vector<char>& vecData);
|
long ReadRemoteBufferByIp(const std::string& strIP, long nOffset, long nSize, std::vector<char>& vecData);
|
long WriteRemoteBufferByIp(const std::string& strIP, long nOffset, const std::vector<char>& vecData);
|
|
// ÉèÖÃ/¸´Î»¶ÔÏóÕ¾µÄÖ¸¶¨Î»ÈíÔª¼þ
|
int SetBitDevice(const StationIdentifier& station, DeviceType enDevType, short nDevNo);
|
int ResetBitDevice(const StationIdentifier& station, DeviceType enDevType, short enDevNo);
|
|
// À©Õ¹ÉèÖÃ/¸´Î»¶ÔÏóÕ¾µÄÖ¸¶¨Î»ÈíÔª¼þ
|
long SetBitDeviceEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo);
|
long ResetBitDeviceEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo);
|
|
// Ö´ÐжÔÏóÕ¾µÄCPU
|
int ControlCPU(const StationIdentifier& station, ControlCode enControlCode);
|
|
// ʼþµÈ´ý£¬vecEventNumbers[0, 64]£¬nTimeoutMs[-1, 2147483647]
|
// ͬʱ·¢ÉúÁ˶à¸öʼþµÄÇé¿öÏ£¬Ê×Ïȼì²â³öÆäÖÐÒ»¸öʼþ¡£ ÔÙ´ÎÖ´ÐÐÁ˱¾º¯ÊýµÄÇé¿öϼì²â³öÆäËüʼþ¡£
|
int WaitForBoardEvent(std::vector<short> 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<char>& vecChar, std::vector<short>& vecShort);
|
static void ConvertShortToChar(const std::vector<short>& vecShort, std::vector<char>& vecChar);
|
static void ConvertUint8ToShort(const std::vector<uint8_t>& vecUint8, std::vector<short>& vecShort);
|
static void ConvertShortToUint8(const std::vector<short>& vecShort, std::vector<uint8_t>& vecUint8);
|
static void ConvertUint32ToShort(const std::vector<uint32_t>& vecUint32, std::vector<short>& vecShort);
|
static void ConvertShortToUint32(const std::vector<short>& vecShort, std::vector<uint32_t>& vecUint32);
|
|
// Ä£°å¸¨Öúº¯Êý
|
template <typename T>
|
int ValidateStationAndData(const StationIdentifier& station, const std::vector<T>& vecData);
|
|
template <typename T, typename U>
|
void ConvertLowToHigh(const std::vector<T>& vecLow, std::vector<U>& vecHigh);
|
|
template <typename T, typename U>
|
void ConvertHighToLow(const std::vector<T>& vecHigh, std::vector<U>& vecLow);
|
|
// ³ÉÔ±±äÁ¿
|
std::mutex m_mtx; // »¥³âËø±£»¤
|
BoardType m_enBoardType; // °å¿éÀàÐÍ
|
long m_nPath; // ͨÐÅ·¾¶
|
std::atomic<bool> m_bConnected; // ÊÇ·ñÒÑÁ¬½Ó
|
std::string m_strLastError; // ×î½üÒ»´Î´íÎóÐÅÏ¢
|
|
// ¾²Ì¬³ÉÔ±±äÁ¿
|
static std::unordered_map<int, std::string> m_mapError; // ´íÎóÂëÓ³Éä±í
|
};
|
|
#endif // PERFORMANCE_MELSEC_H
|