| | |
| | |  |
| | | Microsoft Visual Studio Solution File, Format Version 12.00 |
| | | # Visual Studio Version 16 |
| | | VisualStudioVersion = 16.0.31729.503 |
| | | # Visual Studio Version 17 |
| | | VisualStudioVersion = 17.13.35913.81 d17.13 |
| | | MinimumVisualStudioVersion = 10.0.40219.1 |
| | | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BEQLibrary", "BEQLibrary\BEQLibrary.vcxproj", "{8421CE64-06F9-48F4-A3F3-ACFB683C94D4}" |
| | | EndProject |
| | |
| | | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BoounionPLC", "BoounionPLC\BoounionPLC.vcxproj", "{6DC0600E-5588-4033-A281-3626A4F74B67}" |
| | | EndProject |
| | | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EAPSimulator", "EAPSimulator\EAPSimulator.vcxproj", "{9EA43050-B71C-47A7-AC90-F0D7A88C5F50}" |
| | | EndProject |
| | | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SGMeasurement", "SGMeasurement\SGMeasurement.vcxproj", "{F8087F20-3A3E-18F2-09E3-9C139642EB58}" |
| | | EndProject |
| | | Global |
| | | GlobalSection(SolutionConfigurationPlatforms) = preSolution |
| | |
| | | {9EA43050-B71C-47A7-AC90-F0D7A88C5F50}.Release|x64.Build.0 = Release|x64 |
| | | {9EA43050-B71C-47A7-AC90-F0D7A88C5F50}.Release|x86.ActiveCfg = Release|Win32 |
| | | {9EA43050-B71C-47A7-AC90-F0D7A88C5F50}.Release|x86.Build.0 = Release|Win32 |
| | | {F8087F20-3A3E-18F2-09E3-9C139642EB58}.Debug|x64.ActiveCfg = Debug|x64 |
| | | {F8087F20-3A3E-18F2-09E3-9C139642EB58}.Debug|x64.Build.0 = Debug|x64 |
| | | {F8087F20-3A3E-18F2-09E3-9C139642EB58}.Debug|x86.ActiveCfg = Debug|Win32 |
| | | {F8087F20-3A3E-18F2-09E3-9C139642EB58}.Debug|x86.Build.0 = Debug|Win32 |
| | | {F8087F20-3A3E-18F2-09E3-9C139642EB58}.Release|x64.ActiveCfg = Release|x64 |
| | | {F8087F20-3A3E-18F2-09E3-9C139642EB58}.Release|x64.Build.0 = Release|x64 |
| | | {F8087F20-3A3E-18F2-09E3-9C139642EB58}.Release|x86.ActiveCfg = Release|Win32 |
| | | {F8087F20-3A3E-18F2-09E3-9C139642EB58}.Release|x86.Build.0 = Release|Win32 |
| | | EndGlobalSection |
| | | GlobalSection(SolutionProperties) = preSolution |
| | | HideSolutionNode = FALSE |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "pch.h" |
| | | #include "CCLinkIEControl.h" |
| | | |
| | | CCCLinkIEControl::CCCLinkIEControl() : CPerformanceMelsec(BoardType::CC_LINK_IE_CONTROL) {} |
| | | |
| | | CCCLinkIEControl::~CCCLinkIEControl() = default; |
| | | |
| | | int CCCLinkIEControl::SetBoardModeEx(CCLinkIEControlMode mode) { |
| | | return SetBoardMode(static_cast<short>(mode)); |
| | | } |
| | | |
| | | CCLinkIEControlMode CCCLinkIEControl::GetBoardModeEx() { |
| | | short nMode = 0; |
| | | const int nResult = GetBoardMode(nMode); |
| | | if (nResult != 0) { |
| | | return CCLinkIEControlMode::UNKNOWN; |
| | | } |
| | | |
| | | return ConvertToCCLinkIEControlMode(nMode); |
| | | } |
| | | |
| | | int CCCLinkIEControl::GetBoardStatusEx(BoardStatus& status) { |
| | | const int nResult = GetBoardStatus(status); |
| | | if (nResult != 0) { |
| | | return nResult; |
| | | } |
| | | |
| | | return ValidateBoardStatus(status); |
| | | } |
| | | |
| | | int CCCLinkIEControl::ReadLedStatus(LedStatus& outLedStatus) { |
| | | std::vector<short> vecLedBuffer; |
| | | const int nRet = ReadBoardLed(vecLedBuffer); |
| | | if (nRet != 0) { |
| | | return nRet; |
| | | } |
| | | |
| | | if (vecLedBuffer.empty()) { |
| | | UpdateLastError(ERROR_CODE_INVALID_DATA); |
| | | return ERROR_CODE_INVALID_DATA; |
| | | } |
| | | |
| | | // è§£æåä½ç¶æ |
| | | const short nBuffer = vecLedBuffer[0]; |
| | | outLedStatus.bExtPw = (nBuffer & (1 << 15)) != 0; |
| | | outLedStatus.bRd = (nBuffer & (1 << 6)) != 0; |
| | | outLedStatus.bDLnk = (nBuffer & (1 << 5)) != 0; |
| | | outLedStatus.bPrm = (nBuffer & (1 << 4)) != 0; |
| | | outLedStatus.bErr = (nBuffer & (1 << 3)) != 0; |
| | | outLedStatus.bSd = (nBuffer & (1 << 2)) != 0; |
| | | outLedStatus.bMode = (nBuffer & (1 << 1)) != 0; |
| | | outLedStatus.bRun = (nBuffer & (1 << 0)) != 0; |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | CCLinkIEControlMode CCCLinkIEControl::ConvertToCCLinkIEControlMode(const short nMode) { |
| | | switch (static_cast<CCLinkIEControlMode>(nMode)) { |
| | | case CCLinkIEControlMode::ONLINE: return CCLinkIEControlMode::ONLINE; // å¨çº¿ |
| | | case CCLinkIEControlMode::OFFLINE: return CCLinkIEControlMode::OFFLINE; // 离线 |
| | | case CCLinkIEControlMode::INTER_STATION_TEST: return CCLinkIEControlMode::INTER_STATION_TEST; // ç«é´æµè¯ |
| | | case CCLinkIEControlMode::LINE_TEST: return CCLinkIEControlMode::LINE_TEST; // 线路æµè¯ |
| | | case CCLinkIEControlMode::LOOPBACK_TEST: return CCLinkIEControlMode::LOOPBACK_TEST; // èªåéæµè¯ |
| | | case CCLinkIEControlMode::HW_TEST: return CCLinkIEControlMode::HW_TEST; // H/Wæµè¯ |
| | | case CCLinkIEControlMode::BUS_IF_TEST: return CCLinkIEControlMode::BUS_IF_TEST; // æ»çº¿I/Fæµè¯ |
| | | default: return CCLinkIEControlMode::UNKNOWN; |
| | | } |
| | | } |
| | | |
| | | int CCCLinkIEControl::ValidateBoardStatus(const BoardStatus& status) { |
| | | if (status.nStationValue < 1 || status.nStationValue > 120) { |
| | | return ERROR_CODE_STATION_OUT_OF_RANGE; // ç«å·è¶
åºèå´ |
| | | } |
| | | if (status.nGroupValue < 0 || status.nGroupValue > 32) { |
| | | return ERROR_CODE_GROUP_OUT_OF_RANGE; // ç»è¶
åºèå´ |
| | | } |
| | | if (status.nNetworkValue < 1 || status.nNetworkValue > 239) { |
| | | return ERROR_CODE_NETWORK_OUT_OF_RANGE; // ç½ç»å·è¶
åºèå´ |
| | | } |
| | | return 0; // æ ¡éªéè¿ |
| | | } |
| | | |
| | | int CCCLinkIEControl::ReadDataEx(const StationIdentifier& station, DeviceType enDevType, long devNo, long size, void* pData) |
| | | { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndSize(station, static_cast<short>(size)); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, devNo, &size, pData); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #ifndef CCLINKIECONTROL_H |
| | | #define CCLINKIECONTROL_H |
| | | |
| | | #include "PerformanceMelsec.h" |
| | | |
| | | enum class CCLinkIEControlMode : short { |
| | | UNKNOWN = 0x0194, // δ֪ |
| | | ONLINE = 0x0000, // å¨çº¿ |
| | | OFFLINE = 0x0002, // 离线 |
| | | INTER_STATION_TEST = 0x0005, // ç«é´æµè¯ |
| | | LINE_TEST = 0x0006, // 线路æµè¯ |
| | | LOOPBACK_TEST = 0x0007, // èªåéæµè¯ |
| | | HW_TEST = 0x0009, // H/Wæµè¯ |
| | | BUS_IF_TEST = 0x000E // æ»çº¿I/Fæµè¯ |
| | | }; |
| | | |
| | | class CCCLinkIEControl final : public CPerformanceMelsec { |
| | | public: |
| | | CCCLinkIEControl(); |
| | | ~CCCLinkIEControl() override; |
| | | |
| | | struct LedStatus { |
| | | bool bExtPw; // å¤é¨çµæºç¶æ (b15) |
| | | bool bRd; // æ°æ®æ¥æ¶ç¶æ (b6) |
| | | bool bDLnk; // æ°æ®é¾æ¥ç¶æ (b5) |
| | | bool bPrm; // 管çåè½ç¶æ (b4) |
| | | bool bErr; // éè¯¯ç¶æ (b3) |
| | | bool bSd; // æ°æ®åéç¶æ (b2) |
| | | bool bMode; // å¨ä½æ¨¡å¼ (b1) |
| | | bool bRun; // è¿è¡ç¶æ (b0) |
| | | |
| | | // 转æ¢ä¸ºå符串ï¼ç¨äºè°è¯ |
| | | std::string ToString() const { |
| | | std::ostringstream oss; |
| | | oss << "CC-Link IE Control Network LED Status: {" |
| | | << "\n Ext Power: " << (bExtPw ? "ON" : "OFF") |
| | | << "\n Receive Data: " << (bRd ? "Receiving" : "Not Receiving") |
| | | << "\n Data Link: " << (bDLnk ? "Linked" : "Not Linked") |
| | | << "\n Management: " << (bPrm ? "Managing" : "Not Managing") |
| | | << "\n Error: " << (bErr ? "Error Detected" : "No Error") |
| | | << "\n Send Data: " << (bSd ? "Sending" : "Not Sending") |
| | | << "\n Mode: " << (bMode ? "Executing" : "Not Executing") |
| | | << "\n Run: " << (bRun ? "Running" : "Stopped") |
| | | << "\n}"; |
| | | return oss.str(); |
| | | } |
| | | }; |
| | | |
| | | // 读åç®æ ç«ç¹CPUç±»å |
| | | // short ReadCPUCodeEx(const StationIdentifier& station, short& nCPUCode); |
| | | |
| | | // æ¿æ¨¡å¼è·å/设置 |
| | | int SetBoardModeEx(CCLinkIEControlMode mode); |
| | | CCLinkIEControlMode GetBoardModeEx(); |
| | | |
| | | // è·åæ¿ç¶æ |
| | | int GetBoardStatusEx(BoardStatus& status); |
| | | |
| | | // 读åLEDç¶æ |
| | | int ReadLedStatus(LedStatus& outLedStatus); |
| | | |
| | | int ReadDataEx(const StationIdentifier& station, DeviceType enDevType, long devNo, long size, void* pData); |
| | | |
| | | private: |
| | | static CCLinkIEControlMode ConvertToCCLinkIEControlMode(short nMode); |
| | | static int ValidateBoardStatus(const BoardStatus& status); |
| | | }; |
| | | |
| | | |
| | | #endif //CCLINKIECONTROL_H |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // PerformanceMelsec.cpp: implementation of the CPerformanceMelsec class. |
| | | // |
| | | ////////////////////////////////////////////////////////////////////// |
| | | #include "pch.h" |
| | | #include "PerformanceMelsec.h" |
| | | #include <windows.h> |
| | | #include <iostream> |
| | | #include <fstream> |
| | | |
| | | #ifdef _DEBUG |
| | | #undef THIS_FILE |
| | | static char* THIS_FILE = __FILE__; |
| | | #define new DEBUG_NEW |
| | | #endif |
| | | |
| | | #ifdef _DEBUG |
| | | #define LOG_ERROR(msg) \ |
| | | std::cerr << "[ERROR] " << __FILE__ << ":" << __LINE__ << " (" << __FUNCTION__ << ") - " << msg << std::endl; |
| | | #define LOG_DEBUG(msg) \ |
| | | std::cout << "[DEBUG] " << __FILE__ << ":" << __LINE__ << " (" << __FUNCTION__ << ") - " << msg << std::endl; |
| | | #else |
| | | #define LOG_ERROR(msg) |
| | | #define LOG_DEBUG(msg) |
| | | #endif |
| | | |
| | | // åå§åéææååé |
| | | std::unordered_map<int, std::string> CPerformanceMelsec::m_mapError = { |
| | | // æ¿åSDKé误ç |
| | | {0, "No error, communication successful."}, |
| | | {1, "Driver not started. The driver is not running."}, |
| | | {2, "Timeout error (board response error). Request not completed within timeout."}, |
| | | {66, "Already OPEN error. The specified channel is OPEN."}, |
| | | {68, "Path error. The specified path is invalid."}, |
| | | {69, "Unsupported function execution error."}, |
| | | {70, "Station number error. The specified station number is invalid."}, |
| | | {71, "No received data error (during RECV function)."}, |
| | | {77, "Memory allocation error / insufficient memory resources."}, |
| | | {85, "SEND/RECV channel number error."}, |
| | | {100, "Board H/W resource busy."}, |
| | | {101, "Routing exception."}, |
| | | {102, "Board driver I/F error: Failed to send request data to the board driver."}, |
| | | {103, "Board driver I/F error: Failed to receive response data from the board driver."}, |
| | | {130, "Initial software component No. Error."}, |
| | | {131, "Capacity error."}, |
| | | {133, "Parameter error."}, |
| | | {16385, "Specified target station number does not exist."}, |
| | | {16386, "Received a request that the target station cannot process."}, |
| | | {16418, "Failed to create the event history file."}, |
| | | {16420, "Failed to access the event history file."}, |
| | | {16421, "Another board driver is using the event history file."}, |
| | | {16432, "The specified soft component type does not exist."}, |
| | | {16433, "Soft component specification error: Out of range or invalid start I/O or block number."}, |
| | | {16512, "Request data exception: Invalid data or unsupported module."}, |
| | | {16685, "File association error: Failed to create the event history file."}, |
| | | {16837, "File association error: Event history file does not exist."}, |
| | | {18944, "Link association error: Network does not exist, unsupported CPU, or incorrect network No./station number."}, |
| | | {-1, "Invalid path. The specified function is not supported for this path."}, |
| | | {-2, "Start component No. error. The specified component is out of range."}, |
| | | {-3, "Capacity error. The capacity exceeds the component range."}, |
| | | {-6, "Component type error. The specified type during write is invalid."}, |
| | | {-8, "Channel No. error. The channel specified is invalid."}, |
| | | {-12, "Target path error. The specified path points to an invalid target."}, |
| | | {-13, "Write protection area error. The specified range is protected."}, |
| | | {-16, "Target path conflict. The path conflicts with write protection settings."}, |
| | | {-17, "Device not found or target not responding."}, |
| | | {-18, "Invalid target. The device does not support the operation."}, |
| | | {-19, "Invalid path operation. An unsupported path operation was executed."}, |
| | | {-31, "DLL library call failed or path not initialized."}, |
| | | {-32, "Resource timeout error. Communication timed out or exceeded resource limits."}, |
| | | {-33, "Communication timeout error. The target is not responding or timed out."}, |
| | | {-34, "Unsupported communication target error. The specified network No. or station No. points to an unsupported model."}, |
| | | {-35, "Registry access error."}, |
| | | {-36, "Registry access error."}, |
| | | {-37, "Communication initialization error. The settings for initializing the communication path are invalid."}, |
| | | {-42, "Key information error. Authentication failed."}, |
| | | {-43, "Marking event error. TC waiting event write was executed on the CPU."}, |
| | | {-61, "Marking event error. TC waiting event write was executed on the CPU."}, |
| | | {-62, "Event waiting timeout. The specified external event waiting timed out."}, |
| | | {-63, "Timeout value is out of range."}, |
| | | {-64, "Timeout value is out of range."}, |
| | | {-65, "Event waiting timeout. The specified external event waiting timed out."}, |
| | | {-66, "Timeout-induced resource shortage."}, |
| | | {-67, "Irrelevant file access execution error."}, |
| | | {-69, "Operation executed, but the module does not support the function."}, |
| | | {-70, "The target event processing module returned a rejection."}, |
| | | {-71, "The remote station did not return data correctly."}, |
| | | {-72, "Pointer error. The specified pointer value is invalid."}, |
| | | {-73, "Specified address error."}, |
| | | {-2174, "Buffer data queue exception occurred. Read/write exception to device."}, |
| | | {-7656, "Buffer data queue exception. Read/write exception to the device."}, |
| | | {-7672, "Buffer data queue exception. Read/write exception to the device."}, |
| | | {-11683, "Buffer data transfer error."}, |
| | | {-11717, "Network No. error."}, |
| | | {-11746, "Station No. error."}, |
| | | {-12128, "Buffer data send/response error."}, |
| | | {-18560, "Module mode setting error."}, |
| | | {-18572, "Communication method error."}, |
| | | {-25056, "Processor error."}, |
| | | {-26334, "Duplicate program call or illegal CPU operation."}, |
| | | {-26336, "Routing request error to a station without routing function support."}, |
| | | {-27902, "Event register timeout error."}, |
| | | {-28079, "Communication No. read error."}, |
| | | {-28080, "Communication No. incorrect error."}, |
| | | {-28136, "Unsupported function in fast mode error."}, |
| | | {-28139, "Link disconnection error."}, |
| | | {-28140, "Incorrect mode setting error."}, |
| | | {-28141, "System reboot error."}, |
| | | {-28142, "Mode error."}, |
| | | {-28143, "Hardware self-diagnosis error."}, |
| | | {-28144, "Hardware self-diagnosis error."}, |
| | | {-28150, "Data reception interruption at remote station error."}, |
| | | {-28151, "Data reception interruption at remote station error."}, |
| | | {-28153, "Data reception interruption at remote station error."}, |
| | | {-28154, "Abnormal data reception error."}, |
| | | {-28158, "Driver WDT error."}, |
| | | {-28160, "Hardware resource error."}, |
| | | {-28622, "Dedicated instruction channel in-use error."}, |
| | | {-28634, "Hardware self-diagnosis error."}, |
| | | {-28636, "Hardware self-diagnosis error."}, |
| | | |
| | | // èªå®ä¹é误ç |
| | | {ERROR_CODE_UNKNOWN, "Error: Unknown error code."}, |
| | | {ERROR_CODE_NOT_CONNECTED, "Error: Not connected to the device."}, |
| | | {ERROR_CODE_INVALID_PARAM, "Error: Invalid parameter."}, |
| | | {ERROR_CODE_INVALID_DATA, "Error: Invalid data provided."}, |
| | | {ERROR_CODE_STATION_OUT_OF_RANGE, "Error: Station number is out of range."}, |
| | | {ERROR_CODE_GROUP_OUT_OF_RANGE, "Error: Group number is out of range."}, |
| | | {ERROR_CODE_NETWORK_OUT_OF_RANGE, "Error: Network number is out of range."} |
| | | }; |
| | | |
| | | ////////////////////////////////////////////////////////////////////// |
| | | // Construction/Destruction |
| | | ////////////////////////////////////////////////////////////////////// |
| | | CPerformanceMelsec::CPerformanceMelsec(const BoardType enBoardType) { |
| | | m_nPath = 0; |
| | | m_enBoardType = enBoardType; |
| | | m_bConnected.store(false); |
| | | } |
| | | |
| | | // ææå½æ° |
| | | CPerformanceMelsec::~CPerformanceMelsec() { |
| | | Disconnect(); |
| | | } |
| | | |
| | | // è·åæè¿çéè¯¯ä¿¡æ¯ |
| | | std::string CPerformanceMelsec::GetLastError() const { |
| | | return m_strLastError; |
| | | } |
| | | |
| | | // ä¿åéè¯¯ä¿¡æ¯ |
| | | bool CPerformanceMelsec::SaveErrorInfoToFile(const std::string& filename) { |
| | | // æå¼æä»¶ |
| | | std::ofstream file(filename); |
| | | if (!file.is_open()) { |
| | | std::cerr << "Failed to open file for saving: " << filename << std::endl; |
| | | return false; |
| | | } |
| | | |
| | | // éåéææååé m_mapError å¹¶å°æ¯ä¸ªé误信æ¯åå
¥æä»¶ |
| | | for (const auto& entry : m_mapError) { |
| | | const int nCode = entry.first; |
| | | const std::string& strMessage = entry.second; |
| | | file << nCode << "|" << strMessage << "\n"; |
| | | } |
| | | file.close(); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | // å è½½éè¯¯ä¿¡æ¯ |
| | | bool CPerformanceMelsec::LoadErrorInfoFromFile(const std::string& filename) { |
| | | std::ifstream inFile(filename); |
| | | if (!inFile.is_open()) { |
| | | std::cerr << "Failed to open file for loading: " << filename << std::endl; |
| | | return false; |
| | | } |
| | | |
| | | m_mapError.clear(); |
| | | std::string line; |
| | | while (std::getline(inFile, line)) { |
| | | std::istringstream iss(line); |
| | | int nCode = 0; |
| | | std::string strToken; |
| | | std::string strMessage; |
| | | |
| | | // 使ç¨åé符 "|" è§£ææ¯ä¸è¡ |
| | | if (std::getline(iss, strToken, '|')) { |
| | | nCode = std::stoi(strToken); |
| | | } |
| | | |
| | | if (std::getline(iss, strToken)) { |
| | | strMessage = strToken; |
| | | } |
| | | |
| | | if (!strMessage.empty()) { |
| | | m_mapError[nCode] = strMessage; |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | // è¿æ¥å°PLC |
| | | int CPerformanceMelsec::Connect(const short nChannel, const short nMode) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | | if (m_bConnected.load()) { |
| | | return 0; |
| | | } |
| | | |
| | | const BoardType enBoardType = FindBoardTypeByChannel(nChannel); |
| | | if (enBoardType == BoardType::UNKNOWN || enBoardType != m_enBoardType) { |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // è¿æ¥PLCï¼æ¾å¼ç±»å转æ¢ä»¥å¹é
mdOpen çç¾å |
| | | const short nRet = mdOpen(nChannel, nMode, &m_nPath); |
| | | if (nRet == 0) { |
| | | m_bConnected.store(true); |
| | | m_enBoardType = enBoardType; |
| | | } |
| | | else { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // æå¼è¿æ¥ |
| | | int CPerformanceMelsec::Disconnect() { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | | short nRet = 0; |
| | | if (m_bConnected.load()) { |
| | | nRet = mdClose(m_nPath); |
| | | m_bConnected.store(false); |
| | | m_nPath = 0; |
| | | } |
| | | |
| | | UpdateLastError(nRet); |
| | | LOG_DEBUG("Close connect."); |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // å¯ç¼ç¨æ§å¶å¨è½¯å
ä»¶ä¿¡æ¯è¡¨çåå§å |
| | | int CPerformanceMelsec::InitializeController() { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | | if (!m_bConnected.load()) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | const short nRet = mdInit(m_nPath); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // è·åçæ¬ä¿¡æ¯ |
| | | int CPerformanceMelsec::GetBoardVersion(BoardVersion& version) { |
| | | if (!m_bConnected.load()) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | // è·åçæ¬ä¿¡æ¯ |
| | | short buf[32] = { 0 }; |
| | | const short nRet = mdBdVerRead(m_nPath, buf); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | return nRet; |
| | | } |
| | | |
| | | // å¡«å
çæ¬ä¿¡æ¯å°ç»æä½ |
| | | version.fixedValue[0] = static_cast<char>(buf[0] & 0xFF); |
| | | version.fixedValue[1] = static_cast<char>((buf[0] >> 8) & 0xFF); |
| | | |
| | | version.checksum[0] = static_cast<char>(buf[1] & 0xFF); |
| | | version.checksum[1] = static_cast<char>((buf[1] >> 8) & 0xFF); |
| | | |
| | | version.swVersion[0] = static_cast<char>(buf[2] & 0xFF); |
| | | version.swVersion[1] = static_cast<char>((buf[2] >> 8) & 0xFF); |
| | | |
| | | std::memcpy(version.date, &buf[3], 6); |
| | | |
| | | version.reserved = static_cast<uint32_t>(buf[6]) | (static_cast<uint32_t>(buf[7]) << 16); |
| | | |
| | | std::memcpy(version.swModel, &buf[8], 16); |
| | | std::memcpy(version.hwModel, &buf[16], 16); |
| | | |
| | | version.twoPortMemory[0] = static_cast<char>(buf[18] & 0xFF); |
| | | version.twoPortMemory[1] = static_cast<char>((buf[18] >> 8) & 0xFF); |
| | | |
| | | version.twoPortAttribute[0] = static_cast<char>(buf[19] & 0xFF); |
| | | version.twoPortAttribute[1] = static_cast<char>((buf[19] >> 8) & 0xFF); |
| | | |
| | | version.availableBias[0] = static_cast<char>(buf[20] & 0xFF); |
| | | version.availableBias[1] = static_cast<char>((buf[20] >> 8) & 0xFF); |
| | | |
| | | std::memcpy(version.moduleType, &buf[21], 10); |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // 读åç®æ ç«ç¹CPUç±»å |
| | | int CPerformanceMelsec::ReadCPUCode(const StationIdentifier& station, short& nCPUCode) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | nCPUCode = 0; |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | nRet = mdTypeRead(m_nPath, CombineStation(station), &nCPUCode); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ¿æ¨¡å¼è®¾ç½® |
| | | int CPerformanceMelsec::SetBoardMode(const short nMode) { |
| | | // æ£æ¥æ¯å¦å·²ç»è¿æ¥ |
| | | if (!m_bConnected.load()) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | short nRet = 0; |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | nRet = mdBdModSet(m_nPath, nMode); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // è·åæ¿æ¨¡å¼ |
| | | int CPerformanceMelsec::GetBoardMode(short& nMode) { |
| | | // æ£æ¥æ¯å¦å·²ç»è¿æ¥ |
| | | if (!m_bConnected.load()) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | short nRet = 0; |
| | | { |
| | | nMode = 0; |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | nRet = mdBdModRead(m_nPath, &nMode); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_DEBUG("Raw Mode: " << nMode); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | // æ¿å¤ä½ |
| | | int CPerformanceMelsec::BoardReset() { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | if (!m_bConnected.load()) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | const short nRet = mdBdRst(m_nPath); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ¿LED读å |
| | | int CPerformanceMelsec::ReadBoardLed(std::vector<short>& vecLedBuffer) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | if (!m_bConnected.load()) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | // æ¸
空 LED ç¼å²åº |
| | | vecLedBuffer.clear(); |
| | | vecLedBuffer.resize(16, 0); |
| | | |
| | | // è°ç¨ SDK 彿°è¯»å LED æ°æ® |
| | | const short nRet = mdBdLedRead(m_nPath, vecLedBuffer.data()); |
| | | if (nRet != 0) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | LOG_ERROR("Error reading board LED, ErrorCode: " << nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // è·åæ¿ç¶æ |
| | | int CPerformanceMelsec::GetBoardStatus(BoardStatus& status) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | if (!m_bConnected) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | short buf[6] = { 0 }; |
| | | const short nRet = mdBdSwRead(m_nPath, buf); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | // å° buf æ å°å°ç»æä½ |
| | | status = BoardStatus::fromBuffer(buf); |
| | | return 0; |
| | | } |
| | | |
| | | // éç¨è¯»æ°æ® |
| | | int CPerformanceMelsec::ReadData(const StationIdentifier& station, const long nDevType, const long nDevNo, long nSize, std::vector<short>& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndSize(station, static_cast<short>(nSize)); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // åå§å读åç¼å²åº |
| | | vecData.clear(); |
| | | vecData.resize(nSize, 0); |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | short* pData = vecData.data(); |
| | | nSize *= sizeof(short); |
| | | nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, (long)(unsigned short)nDevNo, &nSize, pData); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | vecData.clear(); // å¦æè¯»åå¤±è´¥ï¼æ¸
空ç¼å²åº |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // 读å使°æ® |
| | | int CPerformanceMelsec::ReadBitData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nBitCount, BitContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndSize(station, nBitCount); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | if (nDevNo % 8 != 0) { |
| | | nRet = -2; |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>((static_cast<int>(nBitCount) + 15) / 16); // 计ç®éè¦è¯»åçåæ°éï¼åä¸åæ´ï¼ |
| | | |
| | | std::vector<short> vecTempBuffer(nSize, 0); |
| | | nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer); |
| | | |
| | | if (nRet == 0) { |
| | | vecData.clear(); |
| | | |
| | | // å°åæ°æ®è§£æä¸ºä½æ°æ® |
| | | for (short nIdx = 0; nIdx < nSize; ++nIdx) { |
| | | const short nCurrentValue = vecTempBuffer[nIdx]; |
| | | // éåå½å short ä¸çæ¯ä¸ä½ |
| | | for (int bitIdx = 0; bitIdx < 16; ++bitIdx) { |
| | | bool bBit = (nCurrentValue & (1 << bitIdx)) != 0; |
| | | vecData.push_back(bBit); |
| | | if (vecData.size() >= nBitCount) { |
| | | return nRet; // 妿已ç»è¯»å宿éç使°ï¼æåéåº |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // 读ååæ°æ® |
| | | int CPerformanceMelsec::ReadWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nWordCount, WordContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndSize(station, nWordCount); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | std::vector<short> vecTempBuffer(nWordCount, 0); |
| | | nRet = ReadData(station, nDevType, nDevNo, nWordCount, vecTempBuffer); |
| | | |
| | | if (nRet == 0) { |
| | | vecData.clear(); |
| | | vecData.assign(vecTempBuffer.begin(), vecTempBuffer.end()); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // 读åååæ°æ® |
| | | int CPerformanceMelsec::ReadDWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nDWordCount, DWordContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndSize(station, nDWordCount); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const auto nSize = static_cast<short>(nDWordCount * 2); // æ¯ä¸ªååå 两个åï¼æ¯ä¸ªååå 4 åèï¼ |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | std::vector<short> vecTempBuffer(nSize, 0); |
| | | nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer); |
| | | |
| | | if (nRet == 0) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertShortToUint32(vecTempBuffer, vecData); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // éç¨åæ°æ® |
| | | int CPerformanceMelsec::WriteData(const StationIdentifier& station, const long nDevType, const long nDevNo, long nSize, short* pData) { |
| | | // éªè¯ç«ç¹åæ° |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // æ°æ®æææ§ |
| | | if (nSize < 0 || pData == nullptr) { |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | nSize *= sizeof(short); |
| | | nRet = mdSendEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, pData); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // å使°æ® |
| | | int CPerformanceMelsec::WriteBitData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const BitContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | if (nDevNo % 8 != 0) { |
| | | nRet = -2; |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>((static_cast<int>(vecData.size()) + 15) / 16); // 计ç®éè¦åå
¥çåæ°éï¼åä¸åæ´ï¼ |
| | | |
| | | // åå¤ä¸´æ¶ç¼å²åºæ¥åå¨è½¬æ¢åç 16 使°æ® |
| | | std::vector<short> vecTempBuffer(nSize, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | // å°ä½æ°æ®æåæå
å°ä¸´æ¶ç¼å²åº |
| | | for (int i = 0; i < vecData.size(); ++i) { |
| | | if (vecData[i]) { |
| | | // ä½¿ç¨ & 0xFFFF ä¿è¯ä¸ä¼è¶
è¿ 16 ä½ï¼é²æ¢æº¢åº |
| | | vecTempBuffer[i / 16] |= static_cast<short>((1 << (i % 16)) & 0xFFFF); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return WriteData(station, nDevType, nDevNo, nSize, vecTempBuffer.data()); |
| | | } |
| | | |
| | | // ååæ°æ® |
| | | int CPerformanceMelsec::WriteWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const WordContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | const int nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // 计ç®éè¦åå
¥çåèæ°ï¼æ¯ä¸ªåå 2 åèï¼ |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>(vecData.size()); |
| | | const auto pData = const_cast<short*>(reinterpret_cast<const short*>(vecData.data())); |
| | | |
| | | return WriteData(station, nDevType, nDevNo, nSize, pData); |
| | | } |
| | | |
| | | // åååæ°æ® |
| | | int CPerformanceMelsec::WriteDWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const DWordContainer& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | const int nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // 计ç®éè¦åå
¥çåèæ°ï¼æ¯ä¸ªååå 4 åèï¼ |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>(vecData.size() * sizeof(short)); |
| | | std::vector<short> vecBuffer(nSize, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertUint32ToShort(vecData, vecBuffer); |
| | | } |
| | | |
| | | return WriteData(station, nDevType, nDevNo, nSize, vecBuffer.data()); |
| | | } |
| | | |
| | | // æ©å±è¯»æ°æ® |
| | | long CPerformanceMelsec::ReadDataEx(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, std::vector<char>& vecData) { |
| | | // éªè¯ç«ç¹åæ°å读å大尿¯å¦ææ |
| | | long nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | if (nSize < 0) { |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | nSize = nSize % 2 != 0 ? nSize + 1 : nSize; |
| | | std::vector<short> vecBuffer(nSize / 2, 0); |
| | | |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, vecBuffer.data()); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | else { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | vecData.resize(nSize); |
| | | ConvertShortToChar(vecBuffer, vecData); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | // æ©å±è¯»å使°æ® |
| | | long CPerformanceMelsec::ReadBitDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nBitCount, BitContainer& vecData) { |
| | | long nRet = ValidateStationAndSize(station, static_cast<short>(nBitCount)); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | |
| | | // === èªå¨å¯¹é½å°èµ·å§å === |
| | | long nWordAlignedStartBit = nDevNo / 16 * 16; |
| | | long nBitOffset = nDevNo - nWordAlignedStartBit; |
| | | long nTotalBits = nBitOffset + nBitCount; |
| | | long nWordCount = (nTotalBits + 15) / 16; |
| | | long nByteSize = nWordCount * sizeof(short); |
| | | |
| | | std::vector<char> vecRaw; |
| | | nRet = ReadDataEx(station, nDevType, nWordAlignedStartBit, nByteSize, vecRaw); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | vecData.clear(); |
| | | for (long i = 0; i < nWordCount; ++i) { |
| | | short word = static_cast<unsigned char>(vecRaw[i * 2]) | |
| | | (static_cast<unsigned char>(vecRaw[i * 2 + 1]) << 8); |
| | | |
| | | for (int j = 0; j < 16; ++j) { |
| | | long bitIndex = i * 16 + j; |
| | | if (bitIndex >= nBitOffset && vecData.size() < static_cast<size_t>(nBitCount)) { |
| | | vecData.push_back((word & (1 << j)) != 0); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | // æ©å±è¯»ååæ°æ® |
| | | long CPerformanceMelsec::ReadWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nWordCount, WordContainer& vecData) { |
| | | long nRet = ValidateStationAndSize(station, static_cast<short>(nWordCount)); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const long nByteSize = nWordCount * sizeof(short); |
| | | |
| | | std::vector<char> vecRaw; |
| | | nRet = ReadDataEx(station, nDevType, nDevNo, nByteSize, vecRaw); |
| | | if (nRet != 0) { |
| | | return nRet; |
| | | } |
| | | |
| | | vecData.clear(); |
| | | for (long i = 0; i < nWordCount; ++i) { |
| | | short value = static_cast<unsigned char>(vecRaw[i * 2]) | |
| | | (static_cast<unsigned char>(vecRaw[i * 2 + 1]) << 8); |
| | | vecData.push_back(value); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | // æ©å±è¯»åååæ°æ® |
| | | long CPerformanceMelsec::ReadDWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, long nDWordCount, DWordContainer& vecData) { |
| | | long nRet = ValidateStationAndSize(station, static_cast<short>(nDWordCount)); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const long nByteSize = nDWordCount * sizeof(uint32_t); |
| | | |
| | | std::vector<char> vecRaw; |
| | | nRet = ReadDataEx(station, nDevType, nDevNo, nByteSize, vecRaw); |
| | | if (nRet != 0) { |
| | | return nRet; |
| | | } |
| | | |
| | | vecData.clear(); |
| | | for (long i = 0; i < nDWordCount; ++i) { |
| | | uint32_t val = static_cast<unsigned char>(vecRaw[i * 4 + 0]) | |
| | | (static_cast<unsigned char>(vecRaw[i * 4 + 1]) << 8) | |
| | | (static_cast<unsigned char>(vecRaw[i * 4 + 2]) << 16) | |
| | | (static_cast<unsigned char>(vecRaw[i * 4 + 3]) << 24); |
| | | vecData.push_back(val); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | // æ©å±åæ°æ® |
| | | long CPerformanceMelsec::WriteDataEx(const StationIdentifier& station, long nDevType, long nDevNo, const std::vector<char>& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | long nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // å° vecData 转æ¢ä¸º short ç±»åçç¼å²åº |
| | | long nSize = static_cast<long>(vecData.size()); |
| | | nSize = nSize % 2 != 0 ? nSize + 1 : nSize; |
| | | std::vector<short> vecBuffer(nSize / 2, 0); |
| | | |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertCharToShort(vecData, vecBuffer); |
| | | nRet = mdSendEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, vecBuffer.data()); |
| | | } |
| | | |
| | | // é误å¤ç忥å¿è®°å½ |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ©å±å使°æ® |
| | | long CPerformanceMelsec::WriteBitDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const BitContainer& vecData) { |
| | | long nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | |
| | | // === 1. èªå¨å¯¹é½èµ·å§å°å === |
| | | long nWordAlignedStartBit = nDevNo / 16 * 16; |
| | | long nBitOffset = nDevNo - nWordAlignedStartBit; |
| | | long nTotalBits = nBitOffset + static_cast<long>(vecData.size()); |
| | | size_t nWordCount = (nTotalBits + 15) / 16; |
| | | |
| | | // === 2. å
读ååå§å¼ä»¥æ¯æé对é½è¦ç === |
| | | std::vector<char> vecRaw; |
| | | nRet = ReadDataEx(station, nDevType, nWordAlignedStartBit, static_cast<long>(nWordCount * sizeof(short)), vecRaw); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // === 3. åå¹¶æ°æ°æ® === |
| | | std::vector<short> vecWordBuffer(nWordCount, 0); |
| | | for (size_t i = 0; i < nWordCount; ++i) { |
| | | vecWordBuffer[i] = static_cast<unsigned char>(vecRaw[i * 2]) | (static_cast<unsigned char>(vecRaw[i * 2 + 1]) << 8); |
| | | } |
| | | |
| | | for (size_t i = 0; i < vecData.size(); ++i) { |
| | | size_t bitIndex = nBitOffset + i; |
| | | size_t wordIdx = bitIndex / 16; |
| | | size_t bitPos = bitIndex % 16; |
| | | if (vecData[i]) { |
| | | vecWordBuffer[wordIdx] |= (1 << bitPos); |
| | | } |
| | | else { |
| | | vecWordBuffer[wordIdx] &= ~(1 << bitPos); |
| | | } |
| | | } |
| | | |
| | | // === 4. 转为åèæµåå
¥ === |
| | | std::vector<char> vecByteBuffer(nWordCount * 2); |
| | | for (size_t i = 0; i < nWordCount; ++i) { |
| | | vecByteBuffer[i * 2] = static_cast<char>(vecWordBuffer[i] & 0xFF); |
| | | vecByteBuffer[i * 2 + 1] = static_cast<char>((vecWordBuffer[i] >> 8) & 0xFF); |
| | | } |
| | | |
| | | return WriteDataEx(station, nDevType, nWordAlignedStartBit, vecByteBuffer); |
| | | } |
| | | |
| | | // æ©å±ååæ°æ® |
| | | long CPerformanceMelsec::WriteWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const WordContainer& vecData) { |
| | | long nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | std::vector<char> vecByteBuffer; |
| | | vecByteBuffer.resize(vecData.size() * sizeof(short)); |
| | | |
| | | for (size_t i = 0; i < vecData.size(); ++i) { |
| | | vecByteBuffer[i * 2] = static_cast<char>(vecData[i] & 0xFF); |
| | | vecByteBuffer[i * 2 + 1] = static_cast<char>((vecData[i] >> 8) & 0xFF); |
| | | } |
| | | |
| | | return WriteDataEx(station, nDevType, nDevNo, vecByteBuffer); |
| | | } |
| | | |
| | | // æ©å±åååæ°æ® |
| | | long CPerformanceMelsec::WriteDWordDataEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo, const DWordContainer& vecData) { |
| | | long nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | std::vector<char> vecByteBuffer; |
| | | vecByteBuffer.resize(vecData.size() * sizeof(uint32_t)); |
| | | |
| | | for (size_t i = 0; i < vecData.size(); ++i) { |
| | | vecByteBuffer[i * 4] = static_cast<char>(vecData[i] & 0xFF); |
| | | vecByteBuffer[i * 4 + 1] = static_cast<char>((vecData[i] >> 8) & 0xFF); |
| | | vecByteBuffer[i * 4 + 2] = static_cast<char>((vecData[i] >> 16) & 0xFF); |
| | | vecByteBuffer[i * 4 + 3] = static_cast<char>((vecData[i] >> 24) & 0xFF); |
| | | } |
| | | |
| | | return WriteDataEx(station, nDevType, nDevNo, vecByteBuffer); |
| | | } |
| | | |
| | | // æ©å±è½¯å
ä»¶éæºè¯»å |
| | | long CPerformanceMelsec::ReadRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, std::vector<char>& vecData) { |
| | | if (vecSoftElements.empty()) { |
| | | UpdateLastError(ERROR_INVALID_PARAMETER); |
| | | LOG_ERROR("Invalid parameters: soft elements are empty."); |
| | | return ERROR_INVALID_PARAMETER; |
| | | } |
| | | |
| | | // åå¤ dev æ°æ® |
| | | std::vector<short> devBuffer(vecSoftElements.size() * 3 + 1, 0); // æ¯ä¸ªè½¯å
ä»¶éè¦ 3 个 shortï¼å¤å ä¸ä¸ªè®¡æ°å¨ |
| | | devBuffer[0] = static_cast<short>(vecSoftElements.size()); // 第ä¸ä¸ªå
ç´ æ¯è½¯å
ä»¶æ°é |
| | | for (size_t i = 0; i < vecSoftElements.size(); ++i) { |
| | | const SoftElement& element = vecSoftElements[i]; |
| | | devBuffer[i * 3 + 1] = element.nType; // 软å
ä»¶ç±»å |
| | | devBuffer[i * 3 + 2] = static_cast<short>(element.nStartNo); // èµ·å§è½¯å
ä»¶ç¼å· |
| | | devBuffer[i * 3 + 3] = element.nElementCount; // ç¹æ° |
| | | } |
| | | |
| | | // 计ç®è¯»åæ°æ®æéç¼å²åºå¤§å° |
| | | long nBufferSize = 0; |
| | | for (const auto& element : vecSoftElements) { |
| | | nBufferSize += element.nElementCount * 2; // æ¯ä¸ªç¹å ç¨ 2 个åè |
| | | } |
| | | |
| | | // éä¿æ¤åè°ç¨ mdRandREx |
| | | long nRet = 0; |
| | | std::vector<short> vecBuffer(nBufferSize / 2, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // ç¡®ä¿çº¿ç¨å®å
¨ |
| | | nRet = mdRandREx(m_nPath, station.nNetNo, station.nStNo, devBuffer.data(), vecBuffer.data(), nBufferSize); |
| | | } |
| | | |
| | | // é误å¤ç忥å¿è®°å½ |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | return nRet; |
| | | } |
| | | |
| | | // å°è¯»åå°ç short æ°æ®è½¬æ¢ä¸º char æ°æ® |
| | | vecData.resize(nBufferSize); |
| | | for (size_t i = 0; i < vecBuffer.size(); ++i) { |
| | | vecData[i * 2] = static_cast<char>(vecBuffer[i] & 0xFF); // ä½åè |
| | | vecData[i * 2 + 1] = static_cast<char>((vecBuffer[i] >> 8) & 0xFF); // é«åè |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ©å±è½¯å
ä»¶éæºåå
¥ï¼æ¯æå¤ä¸ªè½¯å
ä»¶ï¼ |
| | | long CPerformanceMelsec::WriteRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, const std::vector<char>& vecData) { |
| | | if (vecSoftElements.empty() || vecData.empty()) { |
| | | UpdateLastError(ERROR_INVALID_PARAMETER); |
| | | LOG_ERROR("Invalid parameters: soft elements or data is empty."); |
| | | return ERROR_INVALID_PARAMETER; |
| | | } |
| | | |
| | | // åå¤ dev æ°æ® |
| | | std::vector<long> devBuffer(vecSoftElements.size() * 3 + 1, 0); // æ¯ä¸ªè½¯å
ä»¶éè¦ 3 个 longï¼å¤å ä¸ä¸ªè®¡æ°å¨ |
| | | devBuffer[0] = static_cast<long>(vecSoftElements.size()); // 第ä¸ä¸ªå
ç´ æ¯è½¯å
ä»¶æ°é |
| | | for (size_t i = 0; i < vecSoftElements.size(); ++i) { |
| | | const SoftElement& element = vecSoftElements[i]; |
| | | devBuffer[i * 3 + 1] = static_cast<long>(element.nType); // 软å
ä»¶ç±»å |
| | | devBuffer[i * 3 + 2] = element.nStartNo; // èµ·å§è½¯å
ä»¶ç¼å·ï¼å·²ç»æ¯ long ç±»åï¼æ é转æ¢ï¼ |
| | | devBuffer[i * 3 + 3] = static_cast<long>(element.nElementCount); // ç¹æ° |
| | | } |
| | | |
| | | // éä¿æ¤åè°ç¨ mdRandWEx |
| | | long nRet = 0; |
| | | std::vector<short> vecBuffer(vecData.size() / 2, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // ç¡®ä¿çº¿ç¨å®å
¨ |
| | | ConvertCharToShort(vecData, vecBuffer); |
| | | nRet = mdRandWEx(m_nPath, station.nNetNo, station.nStNo, devBuffer.data(), vecBuffer.data(), static_cast<long>(vecBuffer.size())); |
| | | } |
| | | |
| | | // é误å¤ç忥å¿è®°å½ |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨è¯»å |
| | | long CPerformanceMelsec::ReadRemoteBuffer(const StationIdentifier& station, long nOffset, long nSize, std::vector<char>& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | if (nSize < 0) { |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | long nActualSize = (nSize + 1) / 2; |
| | | std::vector<short> vecBuffer(nActualSize, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | nRet = mdRemBufReadEx(m_nPath, station.nNetNo, station.nStNo, nOffset, &nActualSize, vecBuffer.data()); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); // æ´æ°é误ç |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | else { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertShortToChar(vecBuffer, vecData); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨åå
¥ |
| | | long CPerformanceMelsec::WriteRemoteBuffer(const StationIdentifier& station, long nOffset, const std::vector<char>& vecData) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | long nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // å° vecData 转æ¢ä¸º short ç±»åçç¼å²åº |
| | | long nSize = static_cast<long>(vecData.size()); |
| | | std::vector<short> vecBuffer((nSize + 1) / 2, 0); |
| | | |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertCharToShort(vecData, vecBuffer); |
| | | nRet = mdRemBufWriteEx(m_nPath, station.nNetNo, station.nStNo, nOffset, &nSize, vecBuffer.data()); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // è¿ç¨ç«çç¼å²åå¨å¨è¯»å 对象ç«IPå°åæå® |
| | | long CPerformanceMelsec::ReadRemoteBufferByIp(const std::string& strIP, long nOffset, long nSize, std::vector<char>& vecData) { |
| | | uint32_t nAddress = 0; |
| | | if (nSize < 0 || !ConvertIpStringToUint32(strIP, nAddress)) { |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // å°ç¼å²åºå¤§å°è°æ´ä¸º nSize |
| | | vecData.resize(nSize, 0); |
| | | std::vector<short> vecBuffer((nSize + 1) / 2, 0); // 转æ¢ä¸º short ç±»å |
| | | |
| | | // è°ç¨åºå± SDK |
| | | long nRet = 0; |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | nRet = mdRemBufReadIPEx(m_nPath, static_cast<long>(nAddress), nOffset, &nSize, vecBuffer.data()); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | else { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ä¿æ¤ |
| | | ConvertShortToChar(vecBuffer, vecData); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // è¿ç¨ç«çç¼å²åå¨å¨åå
¥ 对象ç«IPå°åæå® |
| | | long CPerformanceMelsec::WriteRemoteBufferByIp(const std::string& strIP, long nOffset, const std::vector<char>& vecData) { |
| | | uint32_t nAddress = 0; |
| | | if (vecData.empty() || !ConvertIpStringToUint32(strIP, nAddress)) { |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // è½¬æ¢ vecData 为 short ç±»åçç¼å²åº |
| | | long nSize = static_cast<long>(vecData.size()); |
| | | std::vector<short> vecBuffer((nSize + 1) / 2, 0); |
| | | |
| | | long nRet = 0; |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ |
| | | ConvertCharToShort(vecData, vecBuffer); |
| | | nRet = mdRemBufWriteIPEx(m_nPath, static_cast<long>(nAddress), nOffset, &nSize, vecBuffer.data()); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // 设置(ON)对象ç«çæå®ä½è½¯å
ä»¶ |
| | | int CPerformanceMelsec::SetBitDevice(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo) { |
| | | // éªè¯ç«ç¹åæ° |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å
¨ |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | nRet = mdDevSet(m_nPath, CombineStation(station), nDevType, nDevNo); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // å¤ä½(OFF)对象ç«çæå®ä½è½¯å
ä»¶ |
| | | int CPerformanceMelsec::ResetBitDevice(const StationIdentifier& station, const DeviceType enDevType, const short enDevNo) { |
| | | // éªè¯ç«ç¹åæ° |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | nRet = mdDevRst(m_nPath, CombineStation(station), nDevType, enDevNo); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ©å±ä½è½¯å
件设置 |
| | | long CPerformanceMelsec::SetBitDeviceEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | | // æ£æ¥åæ°æææ§ |
| | | long nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | long nDevType = static_cast<long>(enDevType); |
| | | nRet = mdDevSetEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ©å±ä½è½¯å
ä»¶å¤ä½ |
| | | long CPerformanceMelsec::ResetBitDeviceEx(const StationIdentifier& station, DeviceType enDevType, long nDevNo) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | | // æ£æ¥åæ°æææ§ |
| | | long nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | long nDevType = static_cast<long>(enDevType); |
| | | nRet = mdDevRstEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // æ§è¡å¯¹è±¡ç«çCPU |
| | | int CPerformanceMelsec::ControlCPU(const StationIdentifier& station, ControlCode enControlCode) { |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // éªè¯æ§å¶ç æ¯å¦åæ³ |
| | | const auto nControlCode = static_cast<short>(enControlCode); |
| | | if (nControlCode < 0 || nControlCode > 2) { |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); // åæ°é误 |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // ç¡®ä¿çº¿ç¨å®å
¨çæå°éå®èå´ |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | nRet = mdControl(m_nPath, CombineStation(station), nControlCode); |
| | | } |
| | | |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | // äºä»¶çå¾
|
| | | int CPerformanceMelsec::WaitForBoardEvent(std::vector<short> vecEventNumbers, const int nTimeoutMs, EventDetails& details) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); |
| | | |
| | | if (!m_bConnected.load()) { |
| | | UpdateLastError(ERROR_CODE_NOT_CONNECTED); |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | if (vecEventNumbers.empty() || vecEventNumbers.size() > 64) { |
| | | UpdateLastError(ERROR_CODE_INVALID_PARAM); |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | // 第 0 个å
ç´ å卿°éï¼æå¤§æ¯æ 64 个äºä»¶ |
| | | std::array<short, 65> eventno = { 0 }; |
| | | eventno[0] = static_cast<short>(vecEventNumbers.size()); |
| | | std::copy(vecEventNumbers.begin(), vecEventNumbers.end(), eventno.begin() + 1); |
| | | |
| | | // åå§åè¾åºåæ° |
| | | details.nEventNo = 0; |
| | | details.details.fill(0); |
| | | |
| | | const int nRet = mdWaitBdEvent(m_nPath, eventno.data(), nTimeoutMs, &details.nEventNo, details.details.data()); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | LOG_ERROR(m_strLastError); |
| | | } |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | //============================================è¾
å©å½æ°======================================================= |
| | | // æ´æ°æè¿çéè¯¯ä¿¡æ¯ |
| | | void CPerformanceMelsec::UpdateLastError(const int nCode) { |
| | | if (nCode == 0) { |
| | | return; |
| | | } |
| | | |
| | | // æ£æ¥éè¯¯ç æ¯å¦åå¨äºæ å°è¡¨ä¸ |
| | | const auto it = m_mapError.find(nCode); |
| | | if (it != m_mapError.end()) { |
| | | // 妿æ¾å°ï¼ç´æ¥è¿å对åºè¯è¨çéè¯¯ä¿¡æ¯ |
| | | m_strLastError = it->second; |
| | | } |
| | | else { |
| | | // å¦ææªæ¾å°ï¼å¤çç¹æ®èå´ |
| | | m_strLastError = "Unknown error."; |
| | | if (nCode == -28611 || nCode == -28612) { |
| | | // ç³»ç»åºé |
| | | m_strLastError = "System error."; |
| | | } |
| | | |
| | | if (nCode >= -20480 && nCode <= -16384) { |
| | | // CC-Link ç³»ç»æ£æµåºçé误 |
| | | m_strLastError = "Error detected in the CC-Link system."; |
| | | } |
| | | |
| | | if (nCode >= -12288 && nCode <= -8193) { |
| | | // CC-Link IE TSN ç³»ç»æ£æµåºçé误 |
| | | m_strLastError = "Error detected in the CC-Link IE TSN system."; |
| | | } |
| | | |
| | | if (nCode >= -8192 && nCode <= -4097) { |
| | | // CC-Link IE æ§å¶ç½ç»ç³»ç»æ£æµåºçé误 |
| | | m_strLastError = "Error detected in the CC-Link IE control network system."; |
| | | } |
| | | |
| | | if (nCode >= -4096 && nCode <= -257) { |
| | | // MELSECNET/10 æ MELSECNET/ç½ç»ç³»ç»é误èå´ |
| | | m_strLastError = "Errors detected in MELSECNET/10 or MELSECNET/network system."; |
| | | } |
| | | |
| | | if (nCode >= 4096 && nCode <= 16383) { |
| | | // MELSEC æ°æ®é¾æ¥åºèå´ |
| | | m_strLastError = "Internal error detected by MELSEC Data Link Library."; |
| | | } |
| | | |
| | | if (nCode == 18944 || nCode == 18945) { |
| | | // 龿¥å
³èåºé |
| | | m_strLastError = "Link association error: Network does not exist, unsupported CPU, or incorrect network No./station number."; |
| | | } |
| | | |
| | | if (nCode >= 16384 && nCode <= 20479) { |
| | | // PLC CPU æ£æµèå´ |
| | | m_strLastError = "Errors detected by the programmable controller CPU in the target station."; |
| | | } |
| | | |
| | | if (nCode >= 28416 && nCode <= 28671) { |
| | | // åä½åè½æ¨¡åèå´ |
| | | m_strLastError = "Error detected in the redundancy module of the target station."; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // æ£æ¥è¿æ¥ç¶æåç«ç¹åæ°æææ§ |
| | | int CPerformanceMelsec::ValidateStation(const StationIdentifier& station) const { |
| | | // æ£æ¥æ¯å¦å·²è¿æ¥ |
| | | if (!m_bConnected.load()) { |
| | | return ERROR_CODE_NOT_CONNECTED; |
| | | } |
| | | |
| | | // æ£æ¥ç½ç»å·åç«ç¹å·èå´ |
| | | if (station.nNetNo < 0 || station.nNetNo > 239 || station.nStNo < 0 || station.nStNo > 255) { |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | return 0; // åæ°ææ |
| | | } |
| | | |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | int CPerformanceMelsec::ValidateStationAndSize(const StationIdentifier& station, const short nCount) const { |
| | | // éªè¯ç«ç¹åæ° |
| | | const int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | return nRet; // 妿ç«ç¹éªè¯å¤±è´¥ï¼è¿å对åºé误ç |
| | | } |
| | | |
| | | if (nCount <= 0) { |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | return 0; // éªè¯éè¿ |
| | | } |
| | | |
| | | // IPå符串转uint32_t |
| | | bool CPerformanceMelsec::ConvertIpStringToUint32(const std::string& strIP, uint32_t& nIP) { |
| | | nIP = 0; |
| | | std::stringstream ss(strIP); |
| | | std::string strSegment; |
| | | int nShift = 24; |
| | | |
| | | while (std::getline(ss, strSegment, '.')) { |
| | | const auto nByte = static_cast<uint32_t>(std::stoi(strSegment)); |
| | | if (nByte > 255) { |
| | | return false; |
| | | } |
| | | nIP |= (nByte << nShift); |
| | | nShift -= 8; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | //============================================éæè¾
å©å½æ°==================================================== |
| | | // å»¶æ¶ï¼å¹¶ä¸è½¬åçªå£æ¶æ¯ |
| | | void CPerformanceMelsec::Delay(const unsigned int nDelayMs) { |
| | | MSG message; |
| | | // å¦æå»¶è¿æ¶é´ä¸º 0ï¼ä»
å¤ç䏿¬¡æ¶æ¯éå |
| | | if (nDelayMs == 0) { |
| | | // éé»å¡çæ£æ¥æ¶æ¯éå |
| | | if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) { |
| | | TranslateMessage(&message); // å°æ¶æ¯è½¬å为ææççªå£æ¶æ¯ |
| | | DispatchMessage(&message); // æ´¾åæ¶æ¯ç»ç¸åºççªå£è¿ç¨ |
| | | } |
| | | return; |
| | | } |
| | | |
| | | DWORD finish; |
| | | const DWORD start = GetTickCount(); // è·åå½åçæ¶é´æ³ï¼ä»ç³»ç»å¯å¨ä»¥æ¥çæ¯«ç§æ°ï¼ |
| | | do { |
| | | if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) { |
| | | TranslateMessage(&message); // è½¬æ¢æ¶æ¯ |
| | | DispatchMessage(&message); // å¤çæ¶æ¯ |
| | | } |
| | | Sleep(1); // æå 1 毫ç§ï¼é²æ¢è¿åº¦å ç¨ CPU |
| | | finish = GetTickCount(); // è·åå½åçæ¶é´æ³ |
| | | } while ((finish - start) < nDelayMs); // 循ç¯ç´å°ç»è¿çæ¶é´å¤§äºæå®çå»¶è¿æ¶é´ |
| | | } |
| | | |
| | | BoardType CPerformanceMelsec::FindBoardTypeByChannel(const int nChannel) { |
| | | if (nChannel >= MELSECNET_CHANNEL(1) && nChannel <= MELSECNET_CHANNEL(4)) { |
| | | return BoardType::MELSECNET_H; |
| | | } |
| | | else if (nChannel >= CC_LINK_CHANNEL(1) && nChannel <= CC_LINK_CHANNEL(4)) { |
| | | return BoardType::CC_LINK_VER_2; |
| | | } |
| | | else if (nChannel >= CC_LINK_IE_CONTROL_CHANNEL(1) && nChannel <= CC_LINK_IE_CONTROL_CHANNEL(4)) { |
| | | return BoardType::CC_LINK_IE_CONTROL; |
| | | } |
| | | else if (nChannel >= CC_LINK_IE_FIELD_CHANNEL(1) && nChannel <= CC_LINK_IE_FIELD_CHANNEL(4)) { |
| | | return BoardType::CC_LINK_IE_FIELD; |
| | | } |
| | | else if (nChannel >= CC_LINK_IE_TSN_CHANNEL(1) && nChannel <= CC_LINK_IE_TSN_CHANNEL(4)) { |
| | | return BoardType::CC_LINK_IE_TSN; |
| | | } |
| | | return BoardType::UNKNOWN; |
| | | } |
| | | |
| | | // åå¹¶ç½ç»å·åç«ç¹å· |
| | | short CPerformanceMelsec::CombineStation(const StationIdentifier& station) { |
| | | return static_cast<short>(station.nStNo | ((station.nNetNo << 8) & 0xFF00)); |
| | | } |
| | | |
| | | // 计ç®è½¯å
ä»¶ç±»å |
| | | short CPerformanceMelsec::CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType) { |
| | | int nDevType = static_cast<int>(enDevType); |
| | | |
| | | // æ ¹æ®è½¯å
ä»¶ç±»åçç¹å®è§åè¿è¡è®¡ç® |
| | | if (enDevType == DeviceType::LX || enDevType == DeviceType::LY || |
| | | enDevType == DeviceType::LB || enDevType == DeviceType::LW || |
| | | enDevType == DeviceType::LSB || enDevType == DeviceType::LSW) { |
| | | // ç½ç»å·å åç§» |
| | | nDevType += station.nNetNo; |
| | | } |
| | | else if (enDevType == DeviceType::ER) { |
| | | // æä»¶å¯åå¨çåå·å åç§» |
| | | nDevType += 0; |
| | | } |
| | | else if (enDevType == DeviceType::SPG) { |
| | | // èµ·å§ I/O No. ÷ 16 çå¼ |
| | | nDevType += 0 / 16; |
| | | } |
| | | |
| | | return static_cast<short>(nDevType); |
| | | } |
| | | |
| | | // std::vector<char>转æ¢ä¸ºstd::vector<short> |
| | | void CPerformanceMelsec::ConvertCharToShort(const std::vector<char>& vecChar, std::vector<short>& vecShort) { |
| | | vecShort.resize((vecChar.size() + 1) / 2, 0); // è°æ´ short 容å¨å¤§å° |
| | | for (size_t i = 0; i < vecChar.size(); i++) { |
| | | if (i % 2 == 0) { |
| | | vecShort[i / 2] = static_cast<unsigned char>(vecChar[i]); // ä½åè |
| | | } |
| | | else { |
| | | vecShort[i / 2] |= static_cast<unsigned char>(vecChar[i]) << 8; // é«åè |
| | | } |
| | | } |
| | | } |
| | | |
| | | // std::vector<short>转æ¢ä¸ºstd::vector<char> |
| | | void CPerformanceMelsec::ConvertShortToChar(const std::vector<short>& vecShort, std::vector<char>& vecChar) { |
| | | vecChar.resize(vecShort.size() * 2); // è°æ´ char 容å¨å¤§å° |
| | | for (size_t i = 0; i < vecShort.size(); i++) { |
| | | vecChar[i * 2] = static_cast<char>(vecShort[i] & 0xFF); // ä½åè |
| | | vecChar[i * 2 + 1] = static_cast<char>((vecShort[i] >> 8) & 0xFF); // é«åè |
| | | } |
| | | } |
| | | |
| | | // std::vector<uint8_t>转æ¢ä¸ºstd::vector<short> |
| | | void CPerformanceMelsec::ConvertUint8ToShort(const std::vector<uint8_t>& vecUint8, std::vector<short>& vecShort) { |
| | | vecShort.resize((vecUint8.size() + 1) / 2, 0); // è°æ´ short 容å¨å¤§å° |
| | | for (size_t i = 0; i < vecUint8.size(); i++) { |
| | | if (i % 2 == 0) { |
| | | vecShort[i / 2] = static_cast<short>(vecUint8[i]); // ä½åè |
| | | } |
| | | else { |
| | | vecShort[i / 2] |= static_cast<short>(vecUint8[i] << 8); // é«åè |
| | | } |
| | | } |
| | | } |
| | | |
| | | // std::vector<short>转æ¢ä¸ºstd::vector<uint8_t> |
| | | void CPerformanceMelsec::ConvertShortToUint8(const std::vector<short>& vecShort, std::vector<uint8_t>& vecUint8) { |
| | | vecUint8.resize(vecShort.size() * 2); // è°æ´ uint8_t 容å¨å¤§å° |
| | | for (size_t i = 0; i < vecShort.size(); i++) { |
| | | vecUint8[i * 2] = static_cast<uint8_t>(vecShort[i] & 0xFF); // ä½åè |
| | | vecUint8[i * 2 + 1] = static_cast<uint8_t>((vecShort[i] >> 8) & 0xFF); // é«åè |
| | | } |
| | | } |
| | | |
| | | // std::vector<uint32_t>转æ¢ä¸ºstd::vector<short> |
| | | void CPerformanceMelsec::ConvertUint32ToShort(const std::vector<uint32_t>& vecUint32, std::vector<short>& vecShort) { |
| | | vecShort.resize(vecUint32.size() * 2); // æ¯ä¸ª uint32_t 转æ¢ä¸ºä¸¤ä¸ª short |
| | | for (size_t i = 0; i < vecUint32.size(); i++) { |
| | | vecShort[i * 2] = static_cast<short>(vecUint32[i] & 0xFFFF); // ä½16ä½ |
| | | vecShort[i * 2 + 1] = static_cast<short>((vecUint32[i] >> 16) & 0xFFFF); // é«16ä½ |
| | | } |
| | | } |
| | | |
| | | // std::vector<short>转æ¢ä¸ºstd::vector<uint32_t> |
| | | void CPerformanceMelsec::ConvertShortToUint32(const std::vector<short>& vecShort, std::vector<uint32_t>& vecUint32) { |
| | | vecUint32.resize((vecShort.size() + 1) / 2, 0); // æ¯ä¸¤ä¸ª short å并为ä¸ä¸ª uint32_t |
| | | for (size_t i = 0; i < vecUint32.size(); i++) { |
| | | vecUint32[i] = (static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2 + 1])) << 16) | // é«16ä½ |
| | | static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2])); // ä½16ä½ |
| | | } |
| | | } |
| | | |
| | | //============================================模æ¿è¾
å©å½æ°==================================================== |
| | | // éªè¯ç«ç¹åæ°åæ°æ®æææ§ |
| | | template <typename T> |
| | | int CPerformanceMelsec::ValidateStationAndData(const StationIdentifier& station, const std::vector<T>& vecData) { |
| | | // éªè¯ç«ç¹åæ° |
| | | const int nRet = ValidateStation(station); |
| | | if (nRet != 0) { |
| | | return nRet; // 妿ç«ç¹éªè¯å¤±è´¥ï¼è¿å对åºé误ç |
| | | } |
| | | |
| | | // éªè¯æ°æ®æ¯å¦ä¸ºç©º |
| | | if (vecData.empty()) { |
| | | return ERROR_CODE_INVALID_PARAM; |
| | | } |
| | | |
| | | return 0; // éªè¯éè¿ |
| | | } |
| | | |
| | | // ç±ä½è½¬é«å®¹å¨ç模æ¿ï¼æ´åï¼ |
| | | template <typename T, typename U> |
| | | void CPerformanceMelsec::ConvertLowToHigh(const std::vector<T>& vecLow, std::vector<U>& vecHigh) { |
| | | static_assert(std::is_integral<T>::value && std::is_integral<U>::value, "T and U must be integral types"); |
| | | |
| | | // èªå¨è®¡ç® nGroupSize |
| | | constexpr size_t nGroupSize = sizeof(U) / sizeof(T); |
| | | |
| | | // 妿 T å U ç大å°ç¸çï¼ç´æ¥è½¬æ¢ |
| | | if (sizeof(T) == sizeof(U)) { |
| | | vecHigh.assign(vecLow.begin(), vecLow.end()); |
| | | return; |
| | | } |
| | | |
| | | // 妿 U ç大尿¯ T çåæ°ï¼æ£å¸¸ç»å |
| | | static_assert(sizeof(U) > sizeof(T), "Size of U must be greater than or equal to size of T"); |
| | | |
| | | // 计ç®å®æ´ç»çæ°é |
| | | size_t nHighSize = (vecLow.size() + nGroupSize - 1) / nGroupSize; // åä¸åæ´ |
| | | vecHigh.resize(nHighSize, 0); |
| | | |
| | | // åå¹¶ä½ä½æ°æ®å°é«ä½æ°æ® |
| | | for (size_t i = 0; i < vecLow.size(); i++) { |
| | | vecHigh[i / nGroupSize] |= (static_cast<U>(vecLow[i]) << ((i % nGroupSize) * CHAR_BIT * sizeof(T))); |
| | | } |
| | | |
| | | return vecHigh; |
| | | } |
| | | |
| | | // ç±é«è½¬ä½å®¹å¨ç模æ¿ï¼æ´åï¼ |
| | | template <typename T, typename U> |
| | | void CPerformanceMelsec::ConvertHighToLow(const std::vector<T>& vecHigh, std::vector<U>& vecLow) { |
| | | static_assert(std::is_integral<T>::value && std::is_integral<U>::value, "T and U must be integral types"); |
| | | |
| | | // èªå¨è®¡ç® nGroupSize |
| | | constexpr size_t nGroupSize = sizeof(T) / sizeof(U); |
| | | |
| | | // 妿 T å U ç大å°ç¸çï¼ç´æ¥è½¬æ¢ |
| | | if (sizeof(T) == sizeof(U)) { |
| | | vecLow.assign(vecHigh.begin(), vecHigh.end()); |
| | | return; |
| | | } |
| | | |
| | | // 妿 T ç大尿¯ U çåæ°ï¼æ£å¸¸åè§£ |
| | | static_assert(sizeof(T) > sizeof(U), "Size of T must be greater than or equal to size of U"); |
| | | |
| | | size_t nLowSize = vecHigh.size() * nGroupSize; // ä½å®¹å¨çå¤§å° |
| | | vecLow.resize(nLowSize, 0); |
| | | |
| | | // åè§£é«ä½æ°æ®å°ä½ä½æ°æ® |
| | | for (size_t i = 0; i < vecHigh.size(); i++) { |
| | | for (size_t j = 0; j < nGroupSize; j++) { |
| | | vecLow[i * nGroupSize + j] = static_cast<U>((vecHigh[i] >> (j * CHAR_BIT * sizeof(U))) & ((1ULL << (CHAR_BIT * sizeof(U))) - 1)); |
| | | } |
| | | } |
| | | |
| | | return vecLow; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #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 |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | |
| | | #ifdef SGIF_EXPORTS |
| | | #define EXP __declspec(dllexport) |
| | | #else |
| | | #define EXP __declspec(dllimport) |
| | | #endif |
| | | |
| | | #include "Winsock2.h" |
| | | #include "Ws2tcpip.h" |
| | | |
| | | #include <stdlib.h> |
| | | #include <stdio.h> |
| | | #include <windows.h> |
| | | #pragma comment(lib, "WS2_32.lib") |
| | | |
| | | // Return Code List |
| | | typedef enum { |
| | | RC_OK = 0x0000, |
| | | // The operation is completed successfully. |
| | | /////////////////////////////////////////////// |
| | | // Communication error from controller notification |
| | | // |
| | | RC_NAK_COMMAND = 0x1001, // Command error |
| | | RC_NAK_COMMAND_LENGTH, // Command length error |
| | | RC_NAK_TIMEOUT, // Timeout |
| | | RC_NAK_CHECKSUM, // Check sum error |
| | | RC_NAK_INVALID_STATE, // Status error |
| | | RC_NAK_OTHER, // Other error |
| | | RC_NAK_PARAMETER, // Parameter error |
| | | RC_NAK_OUT_STAGE, // OUT calculation count limitation error |
| | | RC_NAK_OUT_HEAD_NUM, // No. of used head/OUT over error |
| | | RC_NAK_PARAM_RANGE_DATA_STORED, // OUT No which data reserved over acctive out count |
| | | RC_NAK_OUT_INVALID_CALC, // OUT which cannot be used for calculation was specified for calculation. |
| | | RC_NAK_OUT_VOID, // OUT which specified for calculation is not found. |
| | | RC_NAK_INVALID_CYCLE, // Unavailable sampling cycle |
| | | RC_NAK_CTRL_ERROR, // Main unit error |
| | | RC_NAK_SRAM_ERROR, // Setting value error |
| | | /////////////////////////////////////////////// |
| | | // Communication DLL error notification |
| | | // |
| | | RC_ERR_OPEN_DEVICE = 0x2000,// Opening the device failed. |
| | | RC_ERR_NO_DEVICE, // The device is not open. |
| | | RC_ERR_SEND, // Command sending error |
| | | RC_ERR_RECEIVE, // Response receiving error |
| | | RC_ERR_TIMEOUT, // Timeout |
| | | RC_ERR_NODATA, // No data |
| | | RC_ERR_NOMEMORY, // No free memory |
| | | |
| | | RC_ERR_DISCONNECT, // Cable disconnection suspected |
| | | RC_ERR_UNKNOWN, // Undefined error |
| | | RC_ERR_DEVID_OVER, // over dev_id scale |
| | | RC_ERR_NET_NO_CONN, // no connected at the deviceID |
| | | RC_ERR_IP_EXISTED, |
| | | RC_ERR_SELECT, // select of /socket error |
| | | RC_ERR_NULL_PARAMETER, // NULL point exception from parameter |
| | | RC_ERR_DIY_FUNC, // error due to dir function |
| | | RC_ERR_OVER_PARAMENTER, // paramenter over the limition |
| | | RC_ERR_NOT_SUPPORT // åè½ä¸æ¯æ |
| | | } RC; |
| | | |
| | | //device Version |
| | | typedef enum { |
| | | SG3035 = 0, |
| | | SG3030 = 1, |
| | | SG3085 = 2, |
| | | SG3080 = 3, |
| | | SG5025 = 4, |
| | | SG5020 = 5, |
| | | SG5055 = 6, |
| | | SG5050 = 7, |
| | | SG5085 = 8, |
| | | SG5080 = 9, |
| | | SG5155 = 10, |
| | | SG5150 = 11, |
| | | SC04025 = 12, |
| | | SC03560 = 13, |
| | | SGI500 = 14, |
| | | SGI505 = 15, |
| | | SGI400 = 16, |
| | | SGI405 = 17, |
| | | SGI150 = 18, |
| | | SGI155 = 19, |
| | | SGI080 = 20, |
| | | SGI085 = 21, |
| | | SGI050 = 22, |
| | | SGI055 = 23, |
| | | SGI030 = 24, |
| | | SGI035 = 25, |
| | | SGI020 = 26, |
| | | SGI025 = 27, |
| | | SG3155 = 28, |
| | | SG3150 = 29, |
| | | SC01045 = 30, |
| | | SC10015 = 31, |
| | | SC20011 = 32, |
| | | SC01236 = 33, |
| | | SCI04025 = 34, |
| | | SCI03560 = 35, |
| | | SCI01045 = 36, |
| | | SCI10015 = 37, |
| | | SCI20011 = 38, |
| | | SCI01236 = 39, |
| | | }SGIF_DEVICE_TYPE; |
| | | |
| | | // Measurement value structures |
| | | typedef enum { |
| | | SGIF_FLOATRESULT_VALID, // valid data |
| | | SGIF_FLOATRESULT_RANGEOVER_P, // over range at positive (+) side |
| | | SGIF_FLOATRESULT_RANGEOVER_N, // over range at negative (-) side |
| | | SGIF_FLOATRESULT_WAITING, // Wait for comparator result |
| | | SGIF_FLOATRESULT_ALARM, // alarm |
| | | SGIF_FLOATRESULT_INVALID, // Invalid (error, etc.) |
| | | } SGIF_FLOATRESULT; |
| | | |
| | | // Set ABLE |
| | | typedef enum { |
| | | SGIF_ABLEMODE_AUTO, // AUTO |
| | | SGIF_ABLEMODE_MANUAL, // manual |
| | | } SGIF_ABLEMODE; |
| | | |
| | | // Set Measurement Mode |
| | | typedef enum { |
| | | SGIF_MEASUREMODE_NORMAL, // normal |
| | | SGIF_MEASUREMODE_HALF_T, // translucent object |
| | | SGIF_MEASUREMODE_TRAN_1, // transparent object |
| | | SGIF_MEASUREMODE_TRAN_2, // transparent object 2 |
| | | SGIF_MEASUREMODE_MRS, // multireflective object |
| | | SGIF_MEASUREMODE_OPAQUE = SGIF_MEASUREMODE_MRS, // Semi opaque object |
| | | } SGIF_MEASUREMODE; |
| | | |
| | | // Set Basic Point |
| | | typedef enum { |
| | | SGIF_BASICPOINT_NEAR, // NEAR |
| | | SGIF_BASICPOINT_FAR, // FAR |
| | | } SGIF_BASICPOINT; |
| | | |
| | | // Set Mounting Mode |
| | | typedef enum { |
| | | SGIF_REFLECTIONMODE_DIFFUSION, // diffuse reflection |
| | | SGIF_REFLECTIONMODE_MIRROR, // specular reflection |
| | | } SGIF_REFLECTIONMODE; |
| | | |
| | | // Set Median |
| | | typedef enum { |
| | | SGIF_MEDIAN_OFF, // OFF |
| | | SGIF_MEDIAN_7, // 7 point |
| | | SGIF_MEDIAN_15, // 15 point |
| | | SGIF_MEDIAN_31, // 31 point |
| | | } SGIF_MEDIAN; |
| | | |
| | | // Set LASER CTRL group. |
| | | typedef enum { |
| | | SGIF_LASER_CTRL_GROUP_1, // LASER CTRL 1 |
| | | SGIF_LASER_CTRL_GROUP_2, // LASER CTRL 2 |
| | | } SGIF_LASER_CTRL_GROUP; |
| | | |
| | | // Set a range. |
| | | typedef enum { |
| | | SGIF_RANGE_CENTER, // CENTER |
| | | SGIF_RANGE_FAR, // FAR |
| | | } SGIF_RANGE; |
| | | |
| | | // Set Mutual Interference Prevention Group |
| | | typedef enum { |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_A, // Group A |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_B, // Group B |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_C, // Group C |
| | | } SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP; |
| | | |
| | | // Set calculation method. |
| | | typedef enum { |
| | | SGIF_CALCMETHOD_HEADA, // head A |
| | | SGIF_CALCMETHOD_HEADB, // head B |
| | | SGIF_CALCMETHOD_HEAD_HEADA_PLUS_HEADB, // head A+head B |
| | | SGIF_CALCMETHOD_HEAD_HEADA_MINUS_HEADB, // head A-head B |
| | | SGIF_CALCMETHOD_HEAD_HEADA_TRANSPARENT, // head A transparent object |
| | | SGIF_CALCMETHOD_HEAD_HEADB_TRANSPARENT, // head B transparent object |
| | | |
| | | SGIF_CALCMETHOD_HEAD = 0, // head |
| | | SGIF_CALCMETHOD_OUT, // OUT |
| | | SGIF_CALCMETHOD_ADD, // ADD |
| | | SGIF_CALCMETHOD_SUB, // SUB |
| | | SGIF_CALCMETHOD_AVE, // AVE |
| | | SGIF_CALCMETHOD_MAX, // MAX |
| | | SGIF_CALCMETHOD_MIN, // MIN |
| | | SGIF_CALCMETHOD_PP, // P-P |
| | | } SGIF_CALCMETHOD; |
| | | |
| | | // Set Target Surface |
| | | typedef enum { |
| | | SGIF_CALCTARGET_PEAK_1, // peak 1 |
| | | SGIF_CALCTARGET_PEAK_2, // peak 2 |
| | | SGIF_CALCTARGET_PEAK_3, // peak 3 |
| | | SGIF_CALCTARGET_PEAK_4, // peak 4 |
| | | SGIF_CALCTARGET_PEAK_1_2, // peak 1-peak 2 |
| | | SGIF_CALCTARGET_PEAK_1_3, // peak 1-peak 3 |
| | | SGIF_CALCTARGET_PEAK_1_4, // peak 1-peak 4 |
| | | SGIF_CALCTARGET_PEAK_2_3, // peak 2-peak 3 |
| | | SGIF_CALCTARGET_PEAK_2_4, // peak 2-peak 4 |
| | | SGIF_CALCTARGET_PEAK_3_4, // peak 3-peak 4 |
| | | } SGIF_CALCTARGET; |
| | | |
| | | // Set Filter Mode |
| | | typedef enum { |
| | | SGIF_FILTERMODE_MOVING_AVERAGE, // moving average |
| | | } SGIF_FILTERMODE; |
| | | |
| | | // Specify the filter parameter. (The number of averaging for moving average, or the cutoff frequency for LPF/HPF.) |
| | | |
| | | typedef enum { |
| | | SGIF_FILTERPARA_AVE_1 = 0, // 1 time |
| | | SGIF_FILTERPARA_AVE_4, // 4 times |
| | | SGIF_FILTERPARA_AVE_16, // 16 times |
| | | SGIF_FILTERPARA_AVE_64, // 64 times |
| | | SGIF_FILTERPARA_AVE_256, // 256 times |
| | | SGIF_FILTERPARA_AVE_1024, // 1024 times |
| | | SGIF_FILTERPARA_AVE_4096, // 4096 times |
| | | SGIF_FILTERPARA_AVE_16384, // 16384 times |
| | | SGIF_FILTERPARA_AVE_65536, // 65536 times |
| | | SGIF_FILTERPARA_AVE_262144, // 262144 times |
| | | |
| | | }SGIF_FILTERPARA; |
| | | |
| | | // Set Trigger Mode |
| | | typedef enum { |
| | | SGIF_TRIGGERMODE_EXT1, // external trigger 1 |
| | | SGIF_TRIGGERMODE_EXT2, // external trigger 2 |
| | | } SGIF_TRIGGERMODE; |
| | | |
| | | // Set the Measurement Mode. |
| | | typedef enum { |
| | | SGIF_CALCMODE_NORMAL, // normal |
| | | SGIF_CALCMODE_PEAKHOLD, // peak hold |
| | | SGIF_CALCMODE_BOTTOMHOLD, // bottom hold |
| | | SGIF_CALCMODE_PEAKTOPEAKHOLD, // peak-to-peak hold |
| | | SGIF_CALCMODE_SAMPLEHOLD, // sample hold |
| | | } SGIF_CALCMODE; |
| | | |
| | | // Set Minimum Display Unit |
| | | typedef enum { |
| | | SGIF_DISPLAYUNIT_0000_01MM = 0, // 0.01mm |
| | | SGIF_DISPLAYUNIT_000_001MM, // 0.001mm |
| | | SGIF_DISPLAYUNIT_00_0001MM, // 0.0001mm |
| | | SGIF_DISPLAYUNIT_0_00001MM, // 0.00001mm |
| | | SGIF_DISPLAYUNIT_00000_1UM, // 0.1um |
| | | SGIF_DISPLAYUNIT_0000_01UM, // 0.01um |
| | | SGIF_DISPLAYUNIT_000_001UM, // 0.001um |
| | | |
| | | } SGIF_DISPLAYUNIT; |
| | | |
| | | // Specify OUT |
| | | typedef enum { |
| | | SGIF_OUTNO_01 = 0x0001, // OUT01 |
| | | SGIF_OUTNO_02 = 0x0002, // OUT02 |
| | | SGIF_OUTNO_03 = 0x0004, // OUT03 |
| | | SGIF_OUTNO_04 = 0x0008, // OUT04 |
| | | SGIF_OUTNO_ALL = 0x000F, // All OUTs |
| | | } SGIF_OUTNO; |
| | | |
| | | // Set Storage (Cycle) |
| | | typedef enum { |
| | | SGIF_STORAGECYCLE_1, // sampling rate x 1 |
| | | SGIF_STORAGECYCLE_2, // sampling rate x 2 |
| | | SGIF_STORAGECYCLE_5, // sampling rate x 5 |
| | | SGIF_STORAGECYCLE_10, // sampling rate x 10 |
| | | SGIF_STORAGECYCLE_20, // sampling rate x 20 |
| | | SGIF_STORAGECYCLE_50, // sampling rate x 50 |
| | | SGIF_STORAGECYCLE_100, // sampling rate x 100 |
| | | SGIF_STORAGECYCLE_200, // sampling rate x 200 |
| | | SGIF_STORAGECYCLE_500, // sampling rate x 500 |
| | | SGIF_STORAGECYCLE_1000, // sampling rate x 1000 |
| | | SGIF_STORAGECYCLE_TIMING, // Timing sync |
| | | } SGIF_STORAGECYCLE; |
| | | |
| | | // Set Sampling Rate |
| | | typedef enum { |
| | | //SG5000ç³»å |
| | | SGIF_5000_SAMPLINGCYCLE_590KHZ, // 590kHz |
| | | SGIF_5000_SAMPLINGCYCLE_400KHZ, // 400kHz |
| | | SGIF_5000_SAMPLINGCYCLE_200KHZ, // 200kHz |
| | | SGIF_5000_SAMPLINGCYCLE_88KHZ, // 88kHz |
| | | SGIF_5000_SAMPLINGCYCLE_50KHZ, // 50kHz |
| | | SGIF_5000_SAMPLINGCYCLE_20KHZ, // 20kHz |
| | | SGIF_5000_SAMPLINGCYCLE_10KHZ, // 10kHz |
| | | SGIF_5000_SAMPLINGCYCLE_5KHZ, // 5kHz |
| | | SGIF_5000_SAMPLINGCYCLE_2KHZ, // 2kHz |
| | | SGIF_5000_SAMPLINGCYCLE_1KHZ, // 1kHz+ |
| | | |
| | | //SG3000ç³»å |
| | | SGIF_3000_SAMPLINGCYCLE_88KHZ = 10, // 88kHz |
| | | SGIF_3000_SAMPLINGCYCLE_50KHZ, // 50kHz |
| | | SGIF_3000_SAMPLINGCYCLE_20KHZ, // 20kHz |
| | | SGIF_3000_SAMPLINGCYCLE_10KHZ, // 10kHz |
| | | SGIF_3000_SAMPLINGCYCLE_5KHZ, // 5kHz |
| | | //SGIF_3000_SAMPLINGCYCLE_2KHZ, // 2kHz |
| | | SGIF_3000_SAMPLINGCYCLE_1KHZ, // 1kHz |
| | | |
| | | //SCIç³»å |
| | | SCI_SAMPLINGCYCLE_33KHZ = 30, // 33kHz |
| | | SCI_SAMPLINGCYCLE_20KHZ, // 20kHz |
| | | SCI_SAMPLINGCYCLE_15KHZ, // 15kHz |
| | | SCI_SAMPLINGCYCLE_10KHZ, // 10kHz |
| | | SCI_SAMPLINGCYCLE_5KHZ, // 5kHz |
| | | SCI_SAMPLINGCYCLE_2KHZ, // 2kHz |
| | | SCI_SAMPLINGCYCLE_1KHZ, // 1kHz |
| | | SCI_SAMPLINGCYCLE_05KHZ, // 0.5kHz |
| | | } SGIF_SAMPLINGCYCLE; |
| | | |
| | | // Set Mutual interference prevention |
| | | typedef enum { |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_OFF, // OFF |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_AB_ON, // AB-ON |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_ABC_ON, // ABC-ON |
| | | } SGIF_MUTUAL_INTERFERENCE_PREVENTION; |
| | | |
| | | |
| | | // Set Strobe Time |
| | | typedef enum { |
| | | SGIF_STOROBETIME_2MS, // 2ms |
| | | SGIF_STOROBETIME_5MS, // 5ms |
| | | SGIF_STOROBETIME_10MS, // 10ms |
| | | SGIF_STOROBETIME_20MS, // 20ms |
| | | } SGIF_STOROBETIME; |
| | | |
| | | // Mode Switch |
| | | typedef enum { |
| | | SGIF_MODE_NORMAL, // normal mode |
| | | SGIF_MODE_COMMUNICATION, // setting mode |
| | | } SGIF_MODE; |
| | | |
| | | |
| | | //Encoder ext |
| | | typedef enum { |
| | | SGIF_EmRunningMode_cont,//off |
| | | SGIF_EmRunningMode_time, |
| | | SGIF_EmRunningMode_trig, |
| | | }SGIF_EmRunningMode; |
| | | |
| | | typedef enum { |
| | | SGIF_EmDirection_all,//+- |
| | | SGIF_EmDirection_pos, |
| | | SGIF_EmDirection_neg, |
| | | }SGIF_EmDirection; |
| | | |
| | | typedef enum { |
| | | SGIF_EmEncoderInput_1x1, |
| | | SGIF_EmEncoderInput_2x1, |
| | | SGIF_EmEncoderInput_2x2, |
| | | SGIF_EmEncoderInput_2x4, |
| | | }SGIF_EmEncoderInput; |
| | | typedef enum { |
| | | SGIF_EmInputTime_100 = 100, |
| | | SGIF_EmInputTime_200 = 200, |
| | | SGIF_EmInputTime_500 = 500, |
| | | SGIF_EmInputTime_1000 = 1000, |
| | | SGIF_EmInputTime_2000 = 2000, |
| | | SGIF_EmInputTime_5000 = 5000, |
| | | SGIF_EmInputTime_10000 = 10000, |
| | | SGIF_EmInputTime_20000 = 20000, |
| | | }SGIF_EmInputTime; |
| | | |
| | | |
| | | // Measurement value |
| | | typedef struct { |
| | | int OutNo; // OUT No(1-4) |
| | | SGIF_FLOATRESULT FloatResult; // valid or invalid data |
| | | float Value; // Measurement value |
| | | } SGIF_FLOATVALUE_OUT; |
| | | |
| | | typedef struct { |
| | | SGIF_FLOATRESULT FloatResult; // valid or invalid data |
| | | float Value; // Measurement value |
| | | } SGIF_FLOATVALUE; |
| | | |
| | | // IP address |
| | | typedef struct { |
| | | IN_ADDR IPAddress; |
| | | } SGIF_OPENPARAM_ETHERNET; |
| | | |
| | | //Mask Minimum Display Unit(0.01mm) |
| | | #define MASKUNIT 100 |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" |
| | | { |
| | | #endif |
| | | |
| | | EXP RC WINAPI SGIF_GetDeviceType(IN int DeviceID, OUT SGIF_DEVICE_TYPE* deviceType); |
| | | |
| | | // Measured control commands |
| | | /// |
| | | /// \brief SGIF_GetCameraSpotType å
æç±»å(䏿¯æSCI) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param ControlType: è¾åº0ï¼å°å
æï¼1ï¼å¤§å
æ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCameraSpotType(IN int DeviceID, OUT int *EissionSpotType); |
| | | |
| | | |
| | | /////////////////////////////////////////////// |
| | | // Measurement control commands |
| | | // |
| | | // Measured value output (single) |
| | | /// |
| | | /// \brief SGIF_GetCalcDataSingle æµéå¼è¾åº |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å· |
| | | /// \param CalcData: æµéå¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcDataSingle(IN int DeviceID, IN int OutNo, OUT SGIF_FLOATVALUE_OUT * CalcData); |
| | | |
| | | // Measured value output (multiple) |
| | | /// |
| | | /// \brief SGIF_GetCalcDataMulti å¤ä¸ªæµéå¼è¾åº |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å·ç»å |
| | | /// \param CalcData: æµé弿°ç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcDataMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, OUT SGIF_FLOATVALUE_OUT * CalcData); |
| | | |
| | | // Measured value output (ALL) |
| | | /// |
| | | /// \brief SGIF_GetCalcDataALL å
¨é¨æµéå¼è¾åº |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param CalcData: æµé弿°ç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcDataALL(IN int DeviceID, OUT SGIF_FLOATVALUE_OUT * CalcData); |
| | | |
| | | // Timing ON/OFF (single) |
| | | /// |
| | | /// \brief SGIF_SetTimingSingle 计æ¶ON/OFF(ä¸ä¸ª) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å· |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetTimingSingle(IN int DeviceID, IN int OutNo, IN BOOL OnOff); |
| | | |
| | | // Timing ON/OFF (multiple) |
| | | /// |
| | | /// \brief SGIF_SetTimingMulti 计æ¶ON/OFF(å¤ä¸ª) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å·ç»å |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetTimingMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, IN BOOL OnOff); |
| | | |
| | | // Timing ON/OFF (synchronous) |
| | | /// |
| | | /// \brief SGIF_SetTimingSync 计æ¶ON/OFF(忥) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetTimingSync(IN int DeviceID, IN BOOL OnOff); |
| | | |
| | | // Auto-zero ON/OFF (single) |
| | | /// |
| | | /// \brief SGIF_SetZeroSingle èªå¨å½é¶ï¼ä¸ä¸ªï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å· |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetZeroSingle(IN int DeviceID, IN int OutNo, IN BOOL OnOff); |
| | | |
| | | // Auto-zero ON/OFF (multiple) |
| | | /// |
| | | /// \brief SGIF_SetZeroMulti èªå¨å½é¶ï¼å¤ä¸ªï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å·ç»å |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetZeroMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, IN BOOL OnOff); |
| | | |
| | | // Auto-zero ON/OFF (synchronous) |
| | | /// |
| | | /// \brief SGIF_SetZeroSync èªå¨å½é¶ï¼åæ¥ï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetZeroSync(IN int DeviceID, IN BOOL OnOff); |
| | | |
| | | // Measured value reset (single) |
| | | /// |
| | | /// \brief SGIF_SetResetSingle éç½®ï¼ä¸ä¸ªï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å· |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetResetSingle(IN int DeviceID, IN int OutNo); |
| | | |
| | | // Measured value reset (multiple) |
| | | /// |
| | | /// \brief SGIF_SetResetMulti éç½®ï¼å¤ä¸ªï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å·ç»å |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetResetMulti(IN int DeviceID, IN SGIF_OUTNO OutNo); |
| | | |
| | | // Measured value reset (synchronous) |
| | | /// |
| | | /// \brief SGIF_SetResetSync éç½®ï¼åæ¥ï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetResetSync(IN int DeviceID); |
| | | |
| | | // Program Change |
| | | /// |
| | | /// \brief SGIF_SetProgramNo ç¨åºåæ¢ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param ProgramNo: ç¨åºç¼å·ï¼0å°7ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetProgramNo(IN int DeviceID, IN int ProgramNo); |
| | | |
| | | // Program Check |
| | | /// |
| | | /// \brief SGIF_GetProgramNo ç¨åºç¡®è®¤ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param ProgramNo: ç¨åºç¼å·ï¼0å°7ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetProgramNo(IN int DeviceID, OUT int * ProgramNo); |
| | | |
| | | // Starting the Data Storage |
| | | /// |
| | | /// \brief SGIF_DataStorageStart æ°æ®åå¨å¼å§ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DataStorageStart(IN int DeviceID); |
| | | |
| | | // Stopping the Data Storage |
| | | /// |
| | | /// \brief SGIF_DataStorageStop æ°æ®åå¨åæ¢ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DataStorageStop(IN int DeviceID); |
| | | |
| | | // Outputting the Data Storage |
| | | /// |
| | | /// \brief SGIF_DataStorageGetData æ°æ®å卿°æ®è¾åº |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param NumOfBuffer ç¼å²åºå¤§å°ï¼æå¤å¯æ¥åå¤å°ä¸ªæ°æ®ï¼ |
| | | /// \param OutBuffer æ°æ®æ°ç» |
| | | /// \param NumReceived å®é
æ¥æ¶çæ°æ®ä¸ªæ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DataStorageGetData(IN int DeviceID, IN int OutNo, IN int NumOfBuffer, OUT float * OutBuffer, OUT int *NumReceived); |
| | | |
| | | // Initializing the Data Storage |
| | | /// |
| | | /// \brief SGIF_DataStorageInit æ°æ®åå¨åå§å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DataStorageInit(IN int DeviceID); |
| | | |
| | | // Data Storage Accumulation Status Output |
| | | /// |
| | | /// \brief SGIF_DataStorageGetStatus æ°æ®åå¨ç¶æè¾åº |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param lsStorage åå¨ç¶æ |
| | | /// \param NumStorageData åè¾åºå£å卿°éæ°ç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DataStorageGetStatus(IN int DeviceID, OUT BOOL * lsStorage, OUT int * NumStorageData); |
| | | |
| | | /////////////////////////////////////////////// |
| | | // Setting change commands |
| | | // |
| | | |
| | | // Set Tolerance |
| | | /// |
| | | /// \brief SGIF_SetTolerance å
¬å·®è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param UpperLimit ä¸éï¼ä¼ å
¥ä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param LowerLimit ä¸éï¼ä¼ å
¥ä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param Hystersys æ»åï¼ä¼ å
¥ä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetTolerance(IN int DeviceID, IN int OutNo, IN int UpperLimit, IN int LowerLimit, IN int Hystersys); |
| | | |
| | | // Set ABLE |
| | | /// |
| | | /// \brief SGIF_SetAbleMode Able模å¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AbleMode ģʽ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetAbleMode(IN int DeviceID, IN int HeadNo, IN SGIF_ABLEMODE AbleMode); |
| | | |
| | | // Set ABLE Control Range |
| | | /// |
| | | /// \brief SGIF_SetAbleMinMax Ableæ§å¶èå´è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Min ä¸é |
| | | /// \param Max ä¸é |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetAbleMinMax(IN int DeviceID, IN int HeadNo, IN int Min, IN int Max); |
| | | |
| | | // Set Detection mode |
| | | /// |
| | | /// \brief SGIF_SetMeasureMode æµé模å¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \MeasureMode æµéæ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMeasureMode(IN int DeviceID, IN int HeadNo, IN SGIF_MEASUREMODE MeasureMode); |
| | | |
| | | // Set Base point |
| | | /// |
| | | /// \brief SGIF_SetBasicPoint åºåç¹è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param BasicPoint åºåç¹ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetBasicPoint(IN int DeviceID, IN int HeadNo, IN SGIF_BASICPOINT BasicPoint); |
| | | |
| | | // Set Number of Times of Alarm Processing |
| | | /// |
| | | /// \brief SGIF_SetNumAlarm è¦æ¥æ°éè®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AlarmNum è¦æ¥æ°é |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetNumAlarm(IN int DeviceID, IN int HeadNo, IN int AlarmNum); |
| | | |
| | | // Set Number of Times of Alarm Recovery |
| | | /// |
| | | /// \brief SGIF_SetNumRecovery æ¢å¤æ°éè®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param RecoveryNum æ¢å¤æ¬¡æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetNumRecovery(IN int DeviceID, IN int HeadNo, IN int RecoveryNum); |
| | | |
| | | // Set Alarm Level |
| | | /// |
| | | /// \brief SGIF_SetAlarmLevel è¦æ¥çº§å«è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AlarmLevel è¦æ¥çº§å« |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetAlarmLevel(IN int DeviceID, IN int HeadNo, IN int AlarmLevel); |
| | | |
| | | // Starting the ABLE Calibration |
| | | /// |
| | | /// \brief SGIF_AbleStart Ableæ ¡åå¼å§ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_AbleStart(IN int DeviceID, IN int HeadNo); |
| | | |
| | | // Finishing the ABLE Calibration |
| | | /// |
| | | /// \brief SGIF_AbleStop Ableæ ¡å宿 |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_AbleStop(IN int DeviceID); |
| | | |
| | | // Stopping the ABLE Calibration |
| | | /// |
| | | /// \brief SGIF_AbleCancel AbleУ׼ֹͣ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_AbleCancel(IN int DeviceID); |
| | | |
| | | // Set Mounting Mode |
| | | /// |
| | | /// \brief SGIF_SetReflectionMode å®è£
模å¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param ReflectionMode åå°æ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetReflectionMode(IN int DeviceID, IN int HeadNo, IN SGIF_REFLECTIONMODE ReflectionMode); |
| | | |
| | | // Set Mask |
| | | /// |
| | | /// \brief SGIF_SetMask å±è½è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \param HeadNo ç¹ä½1 |
| | | /// \param HeadNo ç¹ä½2 |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMask(IN int DeviceID, IN int HeadNo, IN BOOL OnOff, IN int Pos1, IN int Pos2); |
| | | |
| | | // Set Median |
| | | /// |
| | | /// \brief SGIF_SetMedian ä¸ä½æ°è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Median ä¸ä½æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMedian(IN int DeviceID, IN int HeadNo, IN SGIF_MEDIAN Median); |
| | | |
| | | // Set LASER CTRL group |
| | | /// |
| | | /// \brief SGIF_SetLaserCtrlGroup Laser Ctrlç»è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param LaserCtrlGroup Laser Ctrlç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetLaserCtrlGroup(IN int DeviceID, IN int HeadNo, IN SGIF_LASER_CTRL_GROUP LaserCtrlGroup); |
| | | |
| | | // Set Mutual interference prevention group |
| | | /// |
| | | /// \brief SGIF_SetMutualInterferencePreventionGroup 鲿¢äºç¸å¹²æ°ç»è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Group ç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMutualInterferencePreventionGroup(IN int DeviceID, IN int HeadNo, IN SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP Group); |
| | | |
| | | // Set Calculation method |
| | | /// |
| | | /// \brief SGIF_SetCalcMethod è®¡ç®æ¹å¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcMethod è®¡ç®æ¹æ³ |
| | | /// \param HeadOutNo ä¼ æå¤´è¾åºç¼å· |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetCalcMethod(IN int DeviceID, IN int OutNo, IN SGIF_CALCMETHOD CalcMethod, IN int HeadOutNo); |
| | | |
| | | // Set Surface to be measured |
| | | /// |
| | | /// \brief SGIF_SetCalcTarget æµéç®æ è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcTarget è®¡ç®æ ç¾ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetCalcTarget(IN int DeviceID, IN int OutNo, IN SGIF_CALCTARGET CalcTarget); |
| | | |
| | | // Set OUT to be calculated (ADD, SUB) |
| | | /// |
| | | /// \brief SGIF_SetOutAddSub å¾
计ç®çOUT(Add,Sub)è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param AddSub1 å¾
计ç®çOUT |
| | | /// \param AddSub2 å¾
计ç®çOUT |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetOutAddSub(IN int DeviceID, IN int OutNo, IN int AddSub1, IN int AddSub2); |
| | | |
| | | // Set OUT to be calculated (AVE, MAX, MIN, P-P) |
| | | /// |
| | | /// \brief SGIF_SetOutOperation å¾
计ç®çOUT(Ave,Max,Min,P-P)è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param TargetOut å¤ä¸ªOUTç»å |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetOutOperation(IN int DeviceID, IN int OutNo, IN SGIF_OUTNO TargetOut); |
| | | |
| | | // Set Scaling |
| | | /// |
| | | /// \brief SGIF_SetScaling 缩æ¾è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param InputValue1 ç¹1çæµéå¼ï¼è¾å
¥å¼ï¼ï¼ä¼ æææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param OutputValue1 ç¹1çæ¾ç¤ºå¼ï¼è¾åºå¼ï¼ï¼ä¼ æææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param InputValue2 ç¹2çæµéå¼ï¼è¾å
¥å¼ï¼ï¼ä¼ æææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param OutputValue2 ç¹2çæ¾ç¤ºå¼ï¼è¾åºå¼ï¼ï¼ä¼ æææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetScaling(IN int DeviceID, IN int OutNo, IN int InputValue1, IN int OutputValue1, IN int InputValue2, IN int OutputValue2); |
| | | |
| | | // Set Filter Mode |
| | | /// |
| | | /// \brief SGIF_SetFilter 滤波å¨è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param FilterMode æ»¤æ³¢æ¨¡å¼ |
| | | /// \param FilterPara æ»¤æ³¢åæ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetFilter(IN int DeviceID, IN int OutNo, IN SGIF_FILTERMODE FilterMode, IN SGIF_FILTERPARA FilterPara); |
| | | |
| | | // Set Trigger Mode |
| | | /// |
| | | /// \brief SGIF_SetTriggerMode è§¦åæ¨¡å¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param TriggerMode è§¦åæ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetTriggerMode(IN int DeviceID, IN int OutNo, IN SGIF_TRIGGERMODE TriggerMode); |
| | | |
| | | // Set Offset |
| | | /// |
| | | /// \brief SGIF_SetOffset åç§»è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param Offset åç§»é |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetOffset(IN int DeviceID, IN int OutNo, IN int Offset); |
| | | |
| | | // Set Calculation Mode |
| | | /// |
| | | /// \brief SGIF_SetCalcMode æ£æµæ¨¡å¼ï¼æµé模å¼ï¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcMode æ£æµæ¨¡å¼ç¼å· |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetCalcMode(IN int DeviceID, IN int OutNo, IN SGIF_CALCMODE CalcMode); |
| | | |
| | | // Set Minimum Display Unit |
| | | /// |
| | | /// \brief SGIF_SetDisplayUnit è®¾å®æ¾ç¤ºåä½è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param DisplayUnit æ¾ç¤ºåä½ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetDisplayUnit(IN int DeviceID, IN int OutNo, IN SGIF_DISPLAYUNIT DisplayUnit); |
| | | |
| | | // Set Synchronization |
| | | /// |
| | | /// \brief SGIF_SetSynchronization åæ¥è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetSynchronization(IN int DeviceID, IN int OutNo, IN BOOL OnOff); |
| | | |
| | | // Set Storage (OUT No. specification) |
| | | /// |
| | | /// \brief SGIF_SetStorageTarget åå¨ï¼OUTç¼å·è§æ ¼ï¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetStorageTarget(IN int DeviceID, IN int OutNo, IN BOOL OnOff); |
| | | |
| | | // Set Sampling Rate |
| | | /// |
| | | /// \brief SGIF_SetSamplingCycle éæ ·å¨æè®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param SamplingCycle éæ ·å¨æ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetSamplingCycle(IN int DeviceID, IN SGIF_SAMPLINGCYCLE SamplingCycle); |
| | | |
| | | // Set Mutual Interference Prevention |
| | | /// |
| | | /// \brief SGIF_SetMutualInterferencePrevention 鲿¢äºç¸å¹²æ°ç»è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OnOff ç»è®¾å® |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMutualInterferencePrevention(IN int DeviceID, IN SGIF_MUTUAL_INTERFERENCE_PREVENTION OnOff); |
| | | |
| | | // Set Strobe Time |
| | | /// |
| | | /// \brief SGIF_SetStrobeTime ééæ¶é´è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param StrobeTime ééæ¶é´ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetStrobeTime(IN int DeviceID, IN SGIF_STOROBETIME StrobeTime); |
| | | |
| | | // Set Data Storage |
| | | /// |
| | | /// \brief SGIF_SetDataStorage æ°æ®åå¨è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param NumStorage å¾
å卿°æ®çç¼å· |
| | | /// \param StorageCycle åå¨å¨æ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetDataStorage(IN int DeviceID, IN int NumStorage, IN SGIF_STORAGECYCLE StorageCycle); |
| | | |
| | | // EncoderSetting |
| | | /// |
| | | /// \brief SGIF_SetRunningMode è¿è¡æ¨¡å¼è®¾ç½®(䏿¯æSCI设å¤) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param runningmode è¿è¡æ¨¡å¼ 0:OFF/1:宿¶/2:触å |
| | | /// \param CatchDirection æ£æµæ¹å 0:æ£è´è®¡æ¶/1:æ£è®¡æ¶/2:è´è®¡æ¶ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetRunningMode(IN int DeviceID, IN SGIF_EmRunningMode Runningmode, IN SGIF_EmDirection CatchDirection); |
| | | |
| | | |
| | | // EncoderInputSetting |
| | | /// |
| | | /// \brief SGIF_SetEncoderMode ç¼ç å¨è¾å
¥æ¨¡å¼è®¾ç½®(䏿¯æSCI设å¤) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param Inputmode è¿è¡æ¨¡å¼ 0:1ç¸1éå¢/1:2ç¸1éå¢/2:2ç¸2éå¢,3:2ç¸4éå¢ |
| | | /// \param MinInputTime æå°è¾å
¥æ¶é´ |
| | | /// \param TrigInterval 触åé´é |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | |
| | | EXP RC WINAPI SGIF_SetEncoderMode(IN int DeviceID, IN SGIF_EmEncoderInput Inputmode,IN SGIF_EmInputTime InputTime,IN int TrigInterval); |
| | | |
| | | // SGIF_SetFormula |
| | | /// |
| | | /// \brief SGIF_SetFormula 设置é
æ¹ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param filePath é
æ¹è·¯å¾ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// derive |
| | | |
| | | EXP RC WINAPI SGIF_SetFormula(IN int DeviceID, IN char* filePath ); |
| | | |
| | | // SGIF_SetFormula |
| | | /// |
| | | /// \brief SGIF_SetFormula 设置é
æ¹ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param filePath é
æ¹è·¯å¾ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DeriveFormula(IN int DeviceID, IN char* filePath); |
| | | /////////////////////////////////////////////// |
| | | // Setting confirmation commands |
| | | // |
| | | // Get Tolerance |
| | | /// |
| | | /// \brief SGIF_GetTolerance å
¬å·®è®¾å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param UpperLimit ä¸éï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param LowerLimit ä¸éï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param Hysteresis æ»åï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetTolerance(IN int DeviceID, IN int OutNo, OUT int * UpperLimit, OUT int * LowerLimit, OUT int * Hysteresis); |
| | | |
| | | // Get ABLE |
| | | /// |
| | | /// \brief SGIF_GetAbleMode Able设å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AbleMode Ableģʽ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetAbleMode(IN int DeviceID, IN int HeadNo, OUT SGIF_ABLEMODE * AbleMode); |
| | | |
| | | // Get ABLE Control Range |
| | | /// |
| | | /// \brief SGIF_GetAbleMinMax Ableæ§å¶èå´è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Min æå°å¼ |
| | | /// \param Max æå¤§å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetAbleMinMax(IN int DeviceID, IN int HeadNo, OUT int * Min, OUT int * Max); |
| | | |
| | | // Get Detection mode |
| | | /// |
| | | /// \brief SGIF_GetMeasureMode æµé模å¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param MeasureMode æµéæ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetMeasureMode(IN int DeviceID, IN int HeadNo, OUT SGIF_MEASUREMODE * MeasureMode); |
| | | |
| | | // Get Base point |
| | | /// |
| | | /// \brief SGIF_GetBasicPoint åºåç¹è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param BasicPoint åºåç¹ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetBasicPoint(IN int DeviceID, IN int HeadNo, OUT SGIF_BASICPOINT * BasicPoint); |
| | | |
| | | // Get Number of Times of Alarm Processing |
| | | /// |
| | | /// \brief SGIF_GetNumAlarm è¦æ¥å¤ç次æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AlarmNum è¦æ¥æ¬¡æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetNumAlarm(IN int DeviceID, IN int HeadNo, OUT int * AlarmNum); |
| | | |
| | | // Get Number of Times of Alarm Recovery |
| | | /// |
| | | /// \brief SGIF_GetNumRecovery è¦æ¥æ¢å¤æ¬¡æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param RecoveryNum æ¢å¤æ¬¡æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetNumRecovery(IN int DeviceID, IN int HeadNo, OUT int * RecoveryNum); |
| | | |
| | | // Get Alarm Level |
| | | /// |
| | | /// \brief SGIF_GetAlarmLevel è¦æ¥çº§å«è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AlarmLevel è¦æ¥çº§å« |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetAlarmLevel(IN int DeviceID, IN int HeadNo, OUT int * AlarmLevel); |
| | | |
| | | // Get Mounting Mode |
| | | /// |
| | | /// \brief SGIF_GetReflectionMode å®è£
模å¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param ReflectionMode åå°æ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetReflectionMode(IN int DeviceID, IN int HeadNo, OUT SGIF_REFLECTIONMODE * ReflectionMode); |
| | | |
| | | // Get Mask |
| | | /// |
| | | /// \brief SGIF_GetMask å±è½è®¾å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \param Pos1 ä½ç½®1 |
| | | /// \param Pos2 ä½ç½®2 |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetMask(IN int DeviceID, IN int HeadNo, OUT BOOL * OnOff, OUT int * Pos1, OUT int * Pos2); |
| | | |
| | | // Get Median |
| | | /// |
| | | /// \brief SGIF_GetMedian ä¸ä½æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Median ä¸ä½æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetMedian(IN int DeviceID, IN int HeadNo, OUT SGIF_MEDIAN * Median); |
| | | |
| | | // Get LASER CTRL group |
| | | /// |
| | | /// \brief SGIF_GetLaserCtrlGroup Laser Ctrlç»è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param LaserCtrlGroup Laser Ctrlç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetLaserCtrlGroup(IN int DeviceID, IN int HeadNo, OUT SGIF_LASER_CTRL_GROUP * LaserCtrlGroup); |
| | | |
| | | // Get Mutual interference prevention group |
| | | /// |
| | | /// \brief SGIF_GetMutualInterferencePreventionGroup 鲿¢äºç¸å¹²æ°ç»è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Group ç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetMutualInterferencePreventionGroup(IN int DeviceID, IN int HeadNo, OUT SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP * Group); |
| | | |
| | | // Get Calculation method |
| | | /// |
| | | /// \brief SGIF_GetCalcMethod è®¡ç®æ¹å¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcMethod è®¡ç®æ¹æ³ |
| | | /// \param HeadOutNo ä¼ æå¤´æOUTç¼å· |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcMethod(IN int DeviceID, IN int OutNo, OUT SGIF_CALCMETHOD * CalcMethod, OUT int * HeadOutNo); |
| | | |
| | | // Get Surface to be measured |
| | | /// |
| | | /// \brief SGIF_GetCalcTarget æµéç®æ è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcTarget è®¡ç®æ ç¾ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcTarget(IN int DeviceID, IN int OutNo, OUT SGIF_CALCTARGET * CalcTarget); |
| | | |
| | | // Get OUT to be calculated (ADD, SUB) |
| | | /// |
| | | /// \brief SGIF_GetOutAddSub å¾
计ç®çOUT(Add,Sub)è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param AddSub1 å¾
计ç®çOUTç¼å·1 |
| | | /// \param AddSub2 å¾
计ç®çOUTç¼å·2 |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetOutAddSub(IN int DeviceID, IN int OutNo, OUT int * AddSub1, OUT int * AddSub2); |
| | | |
| | | // Get OUT to be calculated (AVE, MAX, MIN, P-P) |
| | | /// |
| | | /// \brief SGIF_GetOutOperation å¾
计ç®çOUT(Ave,Max,Min,P-P)è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param TargetOut å¤ä¸ªOUTæHEADç»å |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetOutOperation(IN int DeviceID, IN int OutNo, OUT SGIF_OUTNO * TargetOut); |
| | | |
| | | // Get Scaling |
| | | /// |
| | | /// \brief SGIF_GetScaling 缩æ¾è®¾å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param InputValue1 ç¹1çæµéå¼ï¼è¾å
¥å¼ï¼ï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param OutputValue1 ç¹1çæ¾ç¤ºå¼ï¼è¾åºå¼ï¼ï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param InputValue2 ç¹2çæµéå¼ï¼è¾å
¥å¼ï¼ï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param OutputValue2 ç¹2çæ¾ç¤ºå¼ï¼è¾åºå¼ï¼ï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetScaling(IN int DeviceID, IN int OutNo, OUT int * InputValue1, OUT int * OutputValue1, OUT int * InputValue2, OUT int * OutputValue2); |
| | | |
| | | // Get Filter Mode |
| | | /// |
| | | /// \brief SGIF_GetFilter 滤波å¨è®¾å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param FilterMode æ»¤æ³¢å¨æ¨¡å¼ |
| | | /// \param FilterPara æ»¤æ³¢åæ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetFilter(IN int DeviceID, IN int OutNo, OUT SGIF_FILTERMODE * FilterMode, OUT SGIF_FILTERPARA * FilterPara); |
| | | |
| | | // Get Trigger Mode |
| | | /// |
| | | /// \brief SGIF_GetTriggerMode è§¦åæ¨¡å¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param TriggerMode è§¦åæ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetTriggerMode(IN int DeviceID, IN int OutNo, OUT SGIF_TRIGGERMODE * TriggerMode); |
| | | |
| | | // Get Offset |
| | | /// |
| | | /// \brief SGIF_GetOffset åç§»è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param Offset åç§»é |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetOffset(IN int DeviceID, IN int OutNo, OUT int * Offset); |
| | | |
| | | // Get Calculation Mode |
| | | /// |
| | | /// \brief SGIF_GetCalcMode æ£æµæ¨¡å¼ï¼æµé模å¼ï¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcMode æµéæ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcMode(IN int DeviceID, IN int OutNo, OUT SGIF_CALCMODE * CalcMode); |
| | | |
| | | // Get Minimum Display Unit |
| | | /// |
| | | /// \brief SGIF_GetDisplayUnit æ¾ç¤ºæå°åä½è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param DisplayUnit æ¾ç¤ºæå°åä½ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetDisplayUnit(IN int DeviceID, IN int OutNo, OUT SGIF_DISPLAYUNIT * DisplayUnit); |
| | | |
| | | // Get Synchronization |
| | | /// |
| | | /// \brief SGIF_GetSynchronization åæ¥è®¾å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetSynchronization(IN int DeviceID, IN int OutNo, OUT BOOL * OnOff); |
| | | |
| | | // Get Storage (OUT No. specification) |
| | | /// |
| | | /// \brief SGIF_GetStorageTarget åå¨ï¼OUTç¼å·è®¾å®ï¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetStorageTarget(IN int DeviceID, IN int OutNo, OUT BOOL * OnOff); |
| | | |
| | | // Get Sampling Rate |
| | | /// |
| | | /// \brief SGIF_GetSamplingCycle éæ ·å¨æè·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param SamplingCycle éæ ·å¨æ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetSamplingCycle(IN int DeviceID, OUT SGIF_SAMPLINGCYCLE * SamplingCycle); |
| | | |
| | | // Get Mutual Interference Prevention |
| | | /// |
| | | /// \brief SGIF_GetMutualInterferencePrevention 鲿¢äºç¸å¹²æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OnOff å¼å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetMutualInterferencePrevention(IN int DeviceID, OUT SGIF_MUTUAL_INTERFERENCE_PREVENTION * OnOff); |
| | | |
| | | // Get Strobe Time |
| | | /// |
| | | /// \brief SGIF_GetStrobeTime ééæ¶é´è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutputFormat è¾åºå½¢å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetStrobeTime(IN int DeviceID, OUT SGIF_STOROBETIME * StrobeTime); |
| | | |
| | | // Get Data Storage |
| | | /// |
| | | /// \brief SGIF_GetDataStorage æ°æ®åå¨è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param NumStorage 带å卿°æ®ç¼å· |
| | | /// \param StorageCycle åå¨å¨æ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetDataStorage(IN int DeviceID, OUT int * NumStorage, OUT SGIF_STORAGECYCLE * StorageCycle); |
| | | |
| | | // Get Active head count |
| | | /// |
| | | /// \brief SGIF_GetNumOfUsedHeads 主å¨OUT计æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param NumOfUsedHeads 主å¨OUT/ä¼ æå¤´è®¡æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetNumOfUsedHeads(IN int DeviceID, OUT int * NumOfUsedHeads); |
| | | |
| | | // Get Active OUT count |
| | | /// |
| | | /// \brief SGIF_GetNumOfUsedOut 主å¨ä¼ æå¤´è®¡æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param NumOfUsedHeads 主å¨OUT/ä¼ æå¤´è®¡æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetNumOfUsedOut(IN int DeviceID, OUT int * NumOfUsedOut); |
| | | |
| | | // Get Active Running Time |
| | | /// |
| | | /// \brief SGIF_GetDeviceRuningTime è·åç¸æºè¿è¡æ¶é¿ï¼åä½s |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo 0:æ§å¶å¨ï¼ 1-4ï¼ä¼ æå¤´ç¼å· |
| | | /// \param RuningTime è¿è¡æ¶é´ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetDeviceRuningTime(IN int DeviceID, IN int HeadNo, OUT unsigned int * RuningTime); |
| | | |
| | | /////////////////////////////////////////////// |
| | | // Other commands |
| | | // |
| | | // Opens the Ethernet device. |
| | | /// |
| | | /// \brief SGIF_OpenDeviceETHER æå¼è®¾å¤ç½ç»è¿æ¥ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OpenParam ç½ç»è¿æ¥åæ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_OpenDeviceETHER(IN int DeviceID, SGIF_OPENPARAM_ETHERNET * OpenParam,DWORD TIMEOUT=3); |
| | | |
| | | // Closes the currently open device. |
| | | /// |
| | | /// \brief SGIF_CloseDevice å
³é设å¤ç½ç»è¿æ¥ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_CloseDevice(IN int DeviceID); |
| | | |
| | | /////////////////////////////////////////////// |
| | | // Mode change commands |
| | | // |
| | | // Mode Switch |
| | | /// |
| | | /// \brief SGIF_SetMode 模å¼åæ¢ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param Mode ģʽ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMode(IN int DeviceID, IN SGIF_MODE Mode); |
| | | |
| | | EXP RC WINAPI SGIF_Refresh(IN int DeviceID); |
| | | |
| | | //////////////////////////////////////////////䏿¬¡åè°ç¸å
³/////////////////////////////////////// |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutBuffer æ°æ®æ°ç» |
| | | /// \param NumReceived å®é
æ¥æ¶çæ°æ®ä¸ªæ° |
| | | /// |
| | | typedef void(*SGIF_DataStorageOneTimeCallBack)(OUT int DeviceID); |
| | | |
| | | /////////////////////////////////////////////// |
| | | /// \brief SGIF_SetOneDataStorage 注å䏿¬¡åè° |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param SGIF_BatchOneTimeCallBack åè°å½æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetOneDataStorage(IN int DeviceID, IN SGIF_DataStorageOneTimeCallBack CallFunc); |
| | | ////////////////////////////////////////////////////////////////////////////////////////////// |
| | | |
| | | // Get encoder store value |
| | | /// \brief SGIF_GetEncoderStoreValueç¼ç å¨å¼å卿°æ®è¾åº(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å· |
| | | /// \param NumOfBuffer ç¼å²åºå¤§å°ï¼æå¤å¯æ¥åå¤å°ä¸ªæ°æ®ï¼ |
| | | /// \param OutBuffer æ°æ®æ°ç» |
| | | /// \param NumReceived å®é
æ¥æ¶çæ°æ®ä¸ªæ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetEncoderStoreValue(IN int DeviceID, IN int OutNo, IN int NumOfBuffer, OUT int * OutBuffer, OUT int *NumReceived); |
| | | |
| | | // Get encoder value |
| | | /// \brief SGIF_GetEncoderCurrentValue 读åç¼ç å¨å½åå¼(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å·(1-3) |
| | | /// \param OutBuffer æ°æ®æé |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetEncoderCurrentValue(IN int DeviceID, IN int OutNo, OUT int * OutBuffer); |
| | | |
| | | // encoder Reset |
| | | /// \brief SGIF_EncoderReset ç¼ç å¨å¼ç½®é¶(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å·(1-3) |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_EncoderReset(IN int DeviceID, IN int OutNo); |
| | | |
| | | // Set Encoder Number |
| | | /// \brief SGIF_SetEncoderNumber éæ©ç¼ç å¨(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å·(1-3) |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetEncoderNumber(IN int DeviceID, IN int OutNo); |
| | | |
| | | // Get encoder number |
| | | /// \brief SGIF_GetEncoderNumber 读å设置çç¼ç å¨ç¼å·(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutBuffer æ°æ®æé |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetEncoderNumber(IN int DeviceID, OUT int * OutBuffer); |
| | | |
| | | //Set Encoder Parameters |
| | | /// \brief SGIF_SetEncoderParameters设置ç¼ç å¨åæ°(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å·(1-3) |
| | | /// \param InputMode è¾å
¥æ¨¡å¼ï¼0-3ï¼ |
| | | /// \param InputTime æä½è¾å
¥æ¶é´ï¼100,200,500,1000,2000,5000,10000,20000ï¼(ns) |
| | | /// \param interval é´éï¼1-10000ï¼ |
| | | /// \param OperatingMode è¿è¡æ¨¡å¼ï¼0-2ï¼ |
| | | /// \param DetectionDirection æ£æµæ¹åï¼0-2ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetEncoderParameters(IN int DeviceID, IN int OutNo, IN int InputMode, IN int InputTime, IN int interval, IN int OperatingMode, IN int DetectionDirection); |
| | | |
| | | //Get Encoder Parameters |
| | | /// \brief SGIF_GetEncoderParameters读åç¼ç å¨åæ°(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å·(1-3) |
| | | /// \param InputMode è¾å
¥æ¨¡å¼ï¼0-3ï¼ |
| | | /// \param InputTime æä½è¾å
¥æ¶é´ï¼100,200,500,1000,2000,5000,10000,20000ï¼(ns) |
| | | /// \param interval é´éï¼1-10000ï¼ |
| | | /// \param OperatingMode è¿è¡æ¨¡å¼ï¼0-2ï¼ |
| | | /// \param DetectionDirection æ£æµæ¹åï¼0-2ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | ///4 |
| | | EXP RC WINAPI SGIF_GetEncoderParameters(IN int DeviceID, IN int OutNo, OUT int * InputMode, OUT int * InputTime, OUT int * interval, OUT int * OperatingMode, OUT int * DetectionDirection); |
| | | |
| | | //Set Analog Output |
| | | /// \brief SGIF_SetAnalogOutput 设置模æéè¾åº(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo 模æéç¼å·(1-3) |
| | | /// \param OutputChannel è¾åºééï¼0-3ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetAnalogOutput(IN int DeviceID, IN int OutNo, IN int OutputChannel); |
| | | |
| | | // Retrieve Analog Output Channel Number |
| | | /// \brief SGIF_GetAnalogOutputChannel è·å模æéè¾åºééç¼å·(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo 模æéç¼å·(1-3) |
| | | /// \param OutBuffer æ°æ®æé |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetAnalogOutputChannel(IN int DeviceID, IN int OutNo, OUT int * OutBuffer); |
| | | |
| | | //Set IO Digital Output |
| | | /// \brief SGIF_SetIODigitalOutput 设置IOæ°åè¾åº(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo æ°åè¾åºç¼å·(1-4) |
| | | /// \param Level è¾åºä½æ°ï¼0:OFF,1:HI,2:GO,3:LO,4:STROBEï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetIODigitalOutput(IN int DeviceID, IN int OutNo, IN int Level); |
| | | |
| | | // Retrieve IO Digital Output Channel Number |
| | | /// \brief SGIF_GetIOOutputChannel è·åIOæ°åéè¾åºééç¼å·(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo æ°åè¾åºç¼å·(1-4) |
| | | /// \param OutBuffer æ°æ®æé |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetIOOutputChannel(IN int DeviceID, IN int OutNo, OUT int * OutBuffer); |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | |
| | | #ifdef SGIF_EXPORTS |
| | | #define EXP __declspec(dllexport) |
| | | #else |
| | | #define EXP __declspec(dllimport) |
| | | #endif |
| | | |
| | | #include "Winsock2.h" |
| | | #include "Ws2tcpip.h" |
| | | |
| | | #include <stdlib.h> |
| | | #include <stdio.h> |
| | | #include <windows.h> |
| | | #pragma comment(lib, "WS2_32.lib") |
| | | |
| | | // Return Code List |
| | | typedef enum { |
| | | RC_OK = 0x0000, |
| | | // The operation is completed successfully. |
| | | /////////////////////////////////////////////// |
| | | // Communication error from controller notification |
| | | // |
| | | RC_NAK_COMMAND = 0x1001, // Command error |
| | | RC_NAK_COMMAND_LENGTH, // Command length error |
| | | RC_NAK_TIMEOUT, // Timeout |
| | | RC_NAK_CHECKSUM, // Check sum error |
| | | RC_NAK_INVALID_STATE, // Status error |
| | | RC_NAK_OTHER, // Other error |
| | | RC_NAK_PARAMETER, // Parameter error |
| | | RC_NAK_OUT_STAGE, // OUT calculation count limitation error |
| | | RC_NAK_OUT_HEAD_NUM, // No. of used head/OUT over error |
| | | RC_NAK_PARAM_RANGE_DATA_STORED, // OUT No which data reserved over acctive out count |
| | | RC_NAK_OUT_INVALID_CALC, // OUT which cannot be used for calculation was specified for calculation. |
| | | RC_NAK_OUT_VOID, // OUT which specified for calculation is not found. |
| | | RC_NAK_INVALID_CYCLE, // Unavailable sampling cycle |
| | | RC_NAK_CTRL_ERROR, // Main unit error |
| | | RC_NAK_SRAM_ERROR, // Setting value error |
| | | /////////////////////////////////////////////// |
| | | // Communication DLL error notification |
| | | // |
| | | RC_ERR_OPEN_DEVICE = 0x2000,// Opening the device failed. |
| | | RC_ERR_NO_DEVICE, // The device is not open. |
| | | RC_ERR_SEND, // Command sending error |
| | | RC_ERR_RECEIVE, // Response receiving error |
| | | RC_ERR_TIMEOUT, // Timeout |
| | | RC_ERR_NODATA, // No data |
| | | RC_ERR_NOMEMORY, // No free memory |
| | | |
| | | RC_ERR_DISCONNECT, // Cable disconnection suspected |
| | | RC_ERR_UNKNOWN, // Undefined error |
| | | RC_ERR_DEVID_OVER, // over dev_id scale |
| | | RC_ERR_NET_NO_CONN, // no connected at the deviceID |
| | | RC_ERR_IP_EXISTED, |
| | | RC_ERR_SELECT, // select of /socket error |
| | | RC_ERR_NULL_PARAMETER, // NULL point exception from parameter |
| | | RC_ERR_DIY_FUNC, // error due to dir function |
| | | RC_ERR_OVER_PARAMENTER, // paramenter over the limition |
| | | RC_ERR_NOT_SUPPORT // åè½ä¸æ¯æ |
| | | } RC; |
| | | |
| | | //device Version |
| | | typedef enum { |
| | | SG3035 = 0, |
| | | SG3030 = 1, |
| | | SG3085 = 2, |
| | | SG3080 = 3, |
| | | SG5025 = 4, |
| | | SG5020 = 5, |
| | | SG5055 = 6, |
| | | SG5050 = 7, |
| | | SG5085 = 8, |
| | | SG5080 = 9, |
| | | SG5155 = 10, |
| | | SG5150 = 11, |
| | | SC04025 = 12, |
| | | SC03560 = 13, |
| | | SGI500 = 14, |
| | | SGI505 = 15, |
| | | SGI400 = 16, |
| | | SGI405 = 17, |
| | | SGI150 = 18, |
| | | SGI155 = 19, |
| | | SGI080 = 20, |
| | | SGI085 = 21, |
| | | SGI050 = 22, |
| | | SGI055 = 23, |
| | | SGI030 = 24, |
| | | SGI035 = 25, |
| | | SGI020 = 26, |
| | | SGI025 = 27, |
| | | SG3155 = 28, |
| | | SG3150 = 29, |
| | | SC01045 = 30, |
| | | SC10015 = 31, |
| | | SC20011 = 32, |
| | | SC01236 = 33, |
| | | SCI04025 = 34, |
| | | SCI03560 = 35, |
| | | SCI01045 = 36, |
| | | SCI10015 = 37, |
| | | SCI20011 = 38, |
| | | SCI01236 = 39, |
| | | }SGIF_DEVICE_TYPE; |
| | | |
| | | // Measurement value structures |
| | | typedef enum { |
| | | SGIF_FLOATRESULT_VALID, // valid data |
| | | SGIF_FLOATRESULT_RANGEOVER_P, // over range at positive (+) side |
| | | SGIF_FLOATRESULT_RANGEOVER_N, // over range at negative (-) side |
| | | SGIF_FLOATRESULT_WAITING, // Wait for comparator result |
| | | SGIF_FLOATRESULT_ALARM, // alarm |
| | | SGIF_FLOATRESULT_INVALID, // Invalid (error, etc.) |
| | | } SGIF_FLOATRESULT; |
| | | |
| | | // Set ABLE |
| | | typedef enum { |
| | | SGIF_ABLEMODE_AUTO, // AUTO |
| | | SGIF_ABLEMODE_MANUAL, // manual |
| | | } SGIF_ABLEMODE; |
| | | |
| | | // Set Measurement Mode |
| | | typedef enum { |
| | | SGIF_MEASUREMODE_NORMAL, // normal |
| | | SGIF_MEASUREMODE_HALF_T, // translucent object |
| | | SGIF_MEASUREMODE_TRAN_1, // transparent object |
| | | SGIF_MEASUREMODE_TRAN_2, // transparent object 2 |
| | | SGIF_MEASUREMODE_MRS, // multireflective object |
| | | SGIF_MEASUREMODE_OPAQUE = SGIF_MEASUREMODE_MRS, // Semi opaque object |
| | | } SGIF_MEASUREMODE; |
| | | |
| | | // Set Basic Point |
| | | typedef enum { |
| | | SGIF_BASICPOINT_NEAR, // NEAR |
| | | SGIF_BASICPOINT_FAR, // FAR |
| | | } SGIF_BASICPOINT; |
| | | |
| | | // Set Mounting Mode |
| | | typedef enum { |
| | | SGIF_REFLECTIONMODE_DIFFUSION, // diffuse reflection |
| | | SGIF_REFLECTIONMODE_MIRROR, // specular reflection |
| | | } SGIF_REFLECTIONMODE; |
| | | |
| | | // Set Median |
| | | typedef enum { |
| | | SGIF_MEDIAN_OFF, // OFF |
| | | SGIF_MEDIAN_7, // 7 point |
| | | SGIF_MEDIAN_15, // 15 point |
| | | SGIF_MEDIAN_31, // 31 point |
| | | } SGIF_MEDIAN; |
| | | |
| | | // Set LASER CTRL group. |
| | | typedef enum { |
| | | SGIF_LASER_CTRL_GROUP_1, // LASER CTRL 1 |
| | | SGIF_LASER_CTRL_GROUP_2, // LASER CTRL 2 |
| | | } SGIF_LASER_CTRL_GROUP; |
| | | |
| | | // Set a range. |
| | | typedef enum { |
| | | SGIF_RANGE_CENTER, // CENTER |
| | | SGIF_RANGE_FAR, // FAR |
| | | } SGIF_RANGE; |
| | | |
| | | // Set Mutual Interference Prevention Group |
| | | typedef enum { |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_A, // Group A |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_B, // Group B |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_C, // Group C |
| | | } SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP; |
| | | |
| | | // Set calculation method. |
| | | typedef enum { |
| | | SGIF_CALCMETHOD_HEADA, // head A |
| | | SGIF_CALCMETHOD_HEADB, // head B |
| | | SGIF_CALCMETHOD_HEAD_HEADA_PLUS_HEADB, // head A+head B |
| | | SGIF_CALCMETHOD_HEAD_HEADA_MINUS_HEADB, // head A-head B |
| | | SGIF_CALCMETHOD_HEAD_HEADA_TRANSPARENT, // head A transparent object |
| | | SGIF_CALCMETHOD_HEAD_HEADB_TRANSPARENT, // head B transparent object |
| | | |
| | | SGIF_CALCMETHOD_HEAD = 0, // head |
| | | SGIF_CALCMETHOD_OUT, // OUT |
| | | SGIF_CALCMETHOD_ADD, // ADD |
| | | SGIF_CALCMETHOD_SUB, // SUB |
| | | SGIF_CALCMETHOD_AVE, // AVE |
| | | SGIF_CALCMETHOD_MAX, // MAX |
| | | SGIF_CALCMETHOD_MIN, // MIN |
| | | SGIF_CALCMETHOD_PP, // P-P |
| | | } SGIF_CALCMETHOD; |
| | | |
| | | // Set Target Surface |
| | | typedef enum { |
| | | SGIF_CALCTARGET_PEAK_1, // peak 1 |
| | | SGIF_CALCTARGET_PEAK_2, // peak 2 |
| | | SGIF_CALCTARGET_PEAK_3, // peak 3 |
| | | SGIF_CALCTARGET_PEAK_4, // peak 4 |
| | | SGIF_CALCTARGET_PEAK_1_2, // peak 1-peak 2 |
| | | SGIF_CALCTARGET_PEAK_1_3, // peak 1-peak 3 |
| | | SGIF_CALCTARGET_PEAK_1_4, // peak 1-peak 4 |
| | | SGIF_CALCTARGET_PEAK_2_3, // peak 2-peak 3 |
| | | SGIF_CALCTARGET_PEAK_2_4, // peak 2-peak 4 |
| | | SGIF_CALCTARGET_PEAK_3_4, // peak 3-peak 4 |
| | | } SGIF_CALCTARGET; |
| | | |
| | | // Set Filter Mode |
| | | typedef enum { |
| | | SGIF_FILTERMODE_MOVING_AVERAGE, // moving average |
| | | } SGIF_FILTERMODE; |
| | | |
| | | // Specify the filter parameter. (The number of averaging for moving average, or the cutoff frequency for LPF/HPF.) |
| | | |
| | | typedef enum { |
| | | SGIF_FILTERPARA_AVE_1 = 0, // 1 time |
| | | SGIF_FILTERPARA_AVE_4, // 4 times |
| | | SGIF_FILTERPARA_AVE_16, // 16 times |
| | | SGIF_FILTERPARA_AVE_64, // 64 times |
| | | SGIF_FILTERPARA_AVE_256, // 256 times |
| | | SGIF_FILTERPARA_AVE_1024, // 1024 times |
| | | SGIF_FILTERPARA_AVE_4096, // 4096 times |
| | | SGIF_FILTERPARA_AVE_16384, // 16384 times |
| | | SGIF_FILTERPARA_AVE_65536, // 65536 times |
| | | SGIF_FILTERPARA_AVE_262144, // 262144 times |
| | | |
| | | }SGIF_FILTERPARA; |
| | | |
| | | // Set Trigger Mode |
| | | typedef enum { |
| | | SGIF_TRIGGERMODE_EXT1, // external trigger 1 |
| | | SGIF_TRIGGERMODE_EXT2, // external trigger 2 |
| | | } SGIF_TRIGGERMODE; |
| | | |
| | | // Set the Measurement Mode. |
| | | typedef enum { |
| | | SGIF_CALCMODE_NORMAL, // normal |
| | | SGIF_CALCMODE_PEAKHOLD, // peak hold |
| | | SGIF_CALCMODE_BOTTOMHOLD, // bottom hold |
| | | SGIF_CALCMODE_PEAKTOPEAKHOLD, // peak-to-peak hold |
| | | SGIF_CALCMODE_SAMPLEHOLD, // sample hold |
| | | } SGIF_CALCMODE; |
| | | |
| | | // Set Minimum Display Unit |
| | | typedef enum { |
| | | SGIF_DISPLAYUNIT_0000_01MM = 0, // 0.01mm |
| | | SGIF_DISPLAYUNIT_000_001MM, // 0.001mm |
| | | SGIF_DISPLAYUNIT_00_0001MM, // 0.0001mm |
| | | SGIF_DISPLAYUNIT_0_00001MM, // 0.00001mm |
| | | SGIF_DISPLAYUNIT_00000_1UM, // 0.1um |
| | | SGIF_DISPLAYUNIT_0000_01UM, // 0.01um |
| | | SGIF_DISPLAYUNIT_000_001UM, // 0.001um |
| | | |
| | | } SGIF_DISPLAYUNIT; |
| | | |
| | | // Specify OUT |
| | | typedef enum { |
| | | SGIF_OUTNO_01 = 0x0001, // OUT01 |
| | | SGIF_OUTNO_02 = 0x0002, // OUT02 |
| | | SGIF_OUTNO_03 = 0x0004, // OUT03 |
| | | SGIF_OUTNO_04 = 0x0008, // OUT04 |
| | | SGIF_OUTNO_ALL = 0x000F, // All OUTs |
| | | } SGIF_OUTNO; |
| | | |
| | | // Set Storage (Cycle) |
| | | typedef enum { |
| | | SGIF_STORAGECYCLE_1, // sampling rate x 1 |
| | | SGIF_STORAGECYCLE_2, // sampling rate x 2 |
| | | SGIF_STORAGECYCLE_5, // sampling rate x 5 |
| | | SGIF_STORAGECYCLE_10, // sampling rate x 10 |
| | | SGIF_STORAGECYCLE_20, // sampling rate x 20 |
| | | SGIF_STORAGECYCLE_50, // sampling rate x 50 |
| | | SGIF_STORAGECYCLE_100, // sampling rate x 100 |
| | | SGIF_STORAGECYCLE_200, // sampling rate x 200 |
| | | SGIF_STORAGECYCLE_500, // sampling rate x 500 |
| | | SGIF_STORAGECYCLE_1000, // sampling rate x 1000 |
| | | SGIF_STORAGECYCLE_TIMING, // Timing sync |
| | | } SGIF_STORAGECYCLE; |
| | | |
| | | // Set Sampling Rate |
| | | typedef enum { |
| | | //SG5000ç³»å |
| | | SGIF_5000_SAMPLINGCYCLE_590KHZ, // 590kHz |
| | | SGIF_5000_SAMPLINGCYCLE_400KHZ, // 400kHz |
| | | SGIF_5000_SAMPLINGCYCLE_200KHZ, // 200kHz |
| | | SGIF_5000_SAMPLINGCYCLE_88KHZ, // 88kHz |
| | | SGIF_5000_SAMPLINGCYCLE_50KHZ, // 50kHz |
| | | SGIF_5000_SAMPLINGCYCLE_20KHZ, // 20kHz |
| | | SGIF_5000_SAMPLINGCYCLE_10KHZ, // 10kHz |
| | | SGIF_5000_SAMPLINGCYCLE_5KHZ, // 5kHz |
| | | SGIF_5000_SAMPLINGCYCLE_2KHZ, // 2kHz |
| | | SGIF_5000_SAMPLINGCYCLE_1KHZ, // 1kHz+ |
| | | |
| | | //SG3000ç³»å |
| | | SGIF_3000_SAMPLINGCYCLE_88KHZ = 10, // 88kHz |
| | | SGIF_3000_SAMPLINGCYCLE_50KHZ, // 50kHz |
| | | SGIF_3000_SAMPLINGCYCLE_20KHZ, // 20kHz |
| | | SGIF_3000_SAMPLINGCYCLE_10KHZ, // 10kHz |
| | | SGIF_3000_SAMPLINGCYCLE_5KHZ, // 5kHz |
| | | //SGIF_3000_SAMPLINGCYCLE_2KHZ, // 2kHz |
| | | SGIF_3000_SAMPLINGCYCLE_1KHZ, // 1kHz |
| | | |
| | | //SCIç³»å |
| | | SCI_SAMPLINGCYCLE_33KHZ = 30, // 33kHz |
| | | SCI_SAMPLINGCYCLE_20KHZ, // 20kHz |
| | | SCI_SAMPLINGCYCLE_15KHZ, // 15kHz |
| | | SCI_SAMPLINGCYCLE_10KHZ, // 10kHz |
| | | SCI_SAMPLINGCYCLE_5KHZ, // 5kHz |
| | | SCI_SAMPLINGCYCLE_2KHZ, // 2kHz |
| | | SCI_SAMPLINGCYCLE_1KHZ, // 1kHz |
| | | SCI_SAMPLINGCYCLE_05KHZ, // 0.5kHz |
| | | } SGIF_SAMPLINGCYCLE; |
| | | |
| | | // Set Mutual interference prevention |
| | | typedef enum { |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_OFF, // OFF |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_AB_ON, // AB-ON |
| | | SGIF_MUTUAL_INTERFERENCE_PREVENTION_ABC_ON, // ABC-ON |
| | | } SGIF_MUTUAL_INTERFERENCE_PREVENTION; |
| | | |
| | | |
| | | // Set Strobe Time |
| | | typedef enum { |
| | | SGIF_STOROBETIME_2MS, // 2ms |
| | | SGIF_STOROBETIME_5MS, // 5ms |
| | | SGIF_STOROBETIME_10MS, // 10ms |
| | | SGIF_STOROBETIME_20MS, // 20ms |
| | | } SGIF_STOROBETIME; |
| | | |
| | | // Mode Switch |
| | | typedef enum { |
| | | SGIF_MODE_NORMAL, // normal mode |
| | | SGIF_MODE_COMMUNICATION, // setting mode |
| | | } SGIF_MODE; |
| | | |
| | | |
| | | //Encoder ext |
| | | typedef enum { |
| | | SGIF_EmRunningMode_cont,//off |
| | | SGIF_EmRunningMode_time, |
| | | SGIF_EmRunningMode_trig, |
| | | }SGIF_EmRunningMode; |
| | | |
| | | typedef enum { |
| | | SGIF_EmDirection_all,//+- |
| | | SGIF_EmDirection_pos, |
| | | SGIF_EmDirection_neg, |
| | | }SGIF_EmDirection; |
| | | |
| | | typedef enum { |
| | | SGIF_EmEncoderInput_1x1, |
| | | SGIF_EmEncoderInput_2x1, |
| | | SGIF_EmEncoderInput_2x2, |
| | | SGIF_EmEncoderInput_2x4, |
| | | }SGIF_EmEncoderInput; |
| | | typedef enum { |
| | | SGIF_EmInputTime_100 = 100, |
| | | SGIF_EmInputTime_200 = 200, |
| | | SGIF_EmInputTime_500 = 500, |
| | | SGIF_EmInputTime_1000 = 1000, |
| | | SGIF_EmInputTime_2000 = 2000, |
| | | SGIF_EmInputTime_5000 = 5000, |
| | | SGIF_EmInputTime_10000 = 10000, |
| | | SGIF_EmInputTime_20000 = 20000, |
| | | }SGIF_EmInputTime; |
| | | |
| | | |
| | | // Measurement value |
| | | typedef struct { |
| | | int OutNo; // OUT No(1-4) |
| | | SGIF_FLOATRESULT FloatResult; // valid or invalid data |
| | | float Value; // Measurement value |
| | | } SGIF_FLOATVALUE_OUT; |
| | | |
| | | typedef struct { |
| | | SGIF_FLOATRESULT FloatResult; // valid or invalid data |
| | | float Value; // Measurement value |
| | | } SGIF_FLOATVALUE; |
| | | |
| | | // IP address |
| | | typedef struct { |
| | | IN_ADDR IPAddress; |
| | | } SGIF_OPENPARAM_ETHERNET; |
| | | |
| | | //Mask Minimum Display Unit(0.01mm) |
| | | #define MASKUNIT 100 |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" |
| | | { |
| | | #endif |
| | | |
| | | EXP RC WINAPI SGIF_GetDeviceType(IN int DeviceID, OUT SGIF_DEVICE_TYPE* deviceType); |
| | | |
| | | // Measured control commands |
| | | /// |
| | | /// \brief SGIF_GetCameraSpotType å
æç±»å(䏿¯æSCI) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param ControlType: è¾åº0ï¼å°å
æï¼1ï¼å¤§å
æ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCameraSpotType(IN int DeviceID, OUT int *EissionSpotType); |
| | | |
| | | |
| | | /////////////////////////////////////////////// |
| | | // Measurement control commands |
| | | // |
| | | // Measured value output (single) |
| | | /// |
| | | /// \brief SGIF_GetCalcDataSingle æµéå¼è¾åº |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å· |
| | | /// \param CalcData: æµéå¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcDataSingle(IN int DeviceID, IN int OutNo, OUT SGIF_FLOATVALUE_OUT * CalcData); |
| | | |
| | | // Measured value output (multiple) |
| | | /// |
| | | /// \brief SGIF_GetCalcDataMulti å¤ä¸ªæµéå¼è¾åº |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å·ç»å |
| | | /// \param CalcData: æµé弿°ç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcDataMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, OUT SGIF_FLOATVALUE_OUT * CalcData); |
| | | |
| | | // Measured value output (ALL) |
| | | /// |
| | | /// \brief SGIF_GetCalcDataALL å
¨é¨æµéå¼è¾åº |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param CalcData: æµé弿°ç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcDataALL(IN int DeviceID, OUT SGIF_FLOATVALUE_OUT * CalcData); |
| | | |
| | | // Timing ON/OFF (single) |
| | | /// |
| | | /// \brief SGIF_SetTimingSingle 计æ¶ON/OFF(ä¸ä¸ª) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å· |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetTimingSingle(IN int DeviceID, IN int OutNo, IN BOOL OnOff); |
| | | |
| | | // Timing ON/OFF (multiple) |
| | | /// |
| | | /// \brief SGIF_SetTimingMulti 计æ¶ON/OFF(å¤ä¸ª) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å·ç»å |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetTimingMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, IN BOOL OnOff); |
| | | |
| | | // Timing ON/OFF (synchronous) |
| | | /// |
| | | /// \brief SGIF_SetTimingSync 计æ¶ON/OFF(忥) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetTimingSync(IN int DeviceID, IN BOOL OnOff); |
| | | |
| | | // Auto-zero ON/OFF (single) |
| | | /// |
| | | /// \brief SGIF_SetZeroSingle èªå¨å½é¶ï¼ä¸ä¸ªï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å· |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetZeroSingle(IN int DeviceID, IN int OutNo, IN BOOL OnOff); |
| | | |
| | | // Auto-zero ON/OFF (multiple) |
| | | /// |
| | | /// \brief SGIF_SetZeroMulti èªå¨å½é¶ï¼å¤ä¸ªï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å·ç»å |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetZeroMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, IN BOOL OnOff); |
| | | |
| | | // Auto-zero ON/OFF (synchronous) |
| | | /// |
| | | /// \brief SGIF_SetZeroSync èªå¨å½é¶ï¼åæ¥ï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OnOff: 弿å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetZeroSync(IN int DeviceID, IN BOOL OnOff); |
| | | |
| | | // Measured value reset (single) |
| | | /// |
| | | /// \brief SGIF_SetResetSingle éç½®ï¼ä¸ä¸ªï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å· |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetResetSingle(IN int DeviceID, IN int OutNo); |
| | | |
| | | // Measured value reset (multiple) |
| | | /// |
| | | /// \brief SGIF_SetResetMulti éç½®ï¼å¤ä¸ªï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo: è¾åºOUTç¼å·ç»å |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetResetMulti(IN int DeviceID, IN SGIF_OUTNO OutNo); |
| | | |
| | | // Measured value reset (synchronous) |
| | | /// |
| | | /// \brief SGIF_SetResetSync éç½®ï¼åæ¥ï¼ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetResetSync(IN int DeviceID); |
| | | |
| | | // Program Change |
| | | /// |
| | | /// \brief SGIF_SetProgramNo ç¨åºåæ¢ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param ProgramNo: ç¨åºç¼å·ï¼0å°7ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetProgramNo(IN int DeviceID, IN int ProgramNo); |
| | | |
| | | // Program Check |
| | | /// |
| | | /// \brief SGIF_GetProgramNo ç¨åºç¡®è®¤ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param ProgramNo: ç¨åºç¼å·ï¼0å°7ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetProgramNo(IN int DeviceID, OUT int * ProgramNo); |
| | | |
| | | // Starting the Data Storage |
| | | /// |
| | | /// \brief SGIF_DataStorageStart æ°æ®åå¨å¼å§ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DataStorageStart(IN int DeviceID); |
| | | |
| | | // Stopping the Data Storage |
| | | /// |
| | | /// \brief SGIF_DataStorageStop æ°æ®åå¨åæ¢ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DataStorageStop(IN int DeviceID); |
| | | |
| | | // Outputting the Data Storage |
| | | /// |
| | | /// \brief SGIF_DataStorageGetData æ°æ®å卿°æ®è¾åº |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param NumOfBuffer ç¼å²åºå¤§å°ï¼æå¤å¯æ¥åå¤å°ä¸ªæ°æ®ï¼ |
| | | /// \param OutBuffer æ°æ®æ°ç» |
| | | /// \param NumReceived å®é
æ¥æ¶çæ°æ®ä¸ªæ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DataStorageGetData(IN int DeviceID, IN int OutNo, IN int NumOfBuffer, OUT float * OutBuffer, OUT int *NumReceived); |
| | | |
| | | // Initializing the Data Storage |
| | | /// |
| | | /// \brief SGIF_DataStorageInit æ°æ®åå¨åå§å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DataStorageInit(IN int DeviceID); |
| | | |
| | | // Data Storage Accumulation Status Output |
| | | /// |
| | | /// \brief SGIF_DataStorageGetStatus æ°æ®åå¨ç¶æè¾åº |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param lsStorage åå¨ç¶æ |
| | | /// \param NumStorageData åè¾åºå£å卿°éæ°ç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DataStorageGetStatus(IN int DeviceID, OUT BOOL * lsStorage, OUT int * NumStorageData); |
| | | |
| | | /////////////////////////////////////////////// |
| | | // Setting change commands |
| | | // |
| | | |
| | | // Set Tolerance |
| | | /// |
| | | /// \brief SGIF_SetTolerance å
¬å·®è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param UpperLimit ä¸éï¼ä¼ å
¥ä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param LowerLimit ä¸éï¼ä¼ å
¥ä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param Hystersys æ»åï¼ä¼ å
¥ä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetTolerance(IN int DeviceID, IN int OutNo, IN int UpperLimit, IN int LowerLimit, IN int Hystersys); |
| | | |
| | | // Set ABLE |
| | | /// |
| | | /// \brief SGIF_SetAbleMode Able模å¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AbleMode ģʽ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetAbleMode(IN int DeviceID, IN int HeadNo, IN SGIF_ABLEMODE AbleMode); |
| | | |
| | | // Set ABLE Control Range |
| | | /// |
| | | /// \brief SGIF_SetAbleMinMax Ableæ§å¶èå´è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Min ä¸é |
| | | /// \param Max ä¸é |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetAbleMinMax(IN int DeviceID, IN int HeadNo, IN int Min, IN int Max); |
| | | |
| | | // Set Detection mode |
| | | /// |
| | | /// \brief SGIF_SetMeasureMode æµé模å¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \MeasureMode æµéæ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMeasureMode(IN int DeviceID, IN int HeadNo, IN SGIF_MEASUREMODE MeasureMode); |
| | | |
| | | // Set Base point |
| | | /// |
| | | /// \brief SGIF_SetBasicPoint åºåç¹è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param BasicPoint åºåç¹ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetBasicPoint(IN int DeviceID, IN int HeadNo, IN SGIF_BASICPOINT BasicPoint); |
| | | |
| | | // Set Number of Times of Alarm Processing |
| | | /// |
| | | /// \brief SGIF_SetNumAlarm è¦æ¥æ°éè®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AlarmNum è¦æ¥æ°é |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetNumAlarm(IN int DeviceID, IN int HeadNo, IN int AlarmNum); |
| | | |
| | | // Set Number of Times of Alarm Recovery |
| | | /// |
| | | /// \brief SGIF_SetNumRecovery æ¢å¤æ°éè®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param RecoveryNum æ¢å¤æ¬¡æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetNumRecovery(IN int DeviceID, IN int HeadNo, IN int RecoveryNum); |
| | | |
| | | // Set Alarm Level |
| | | /// |
| | | /// \brief SGIF_SetAlarmLevel è¦æ¥çº§å«è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AlarmLevel è¦æ¥çº§å« |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetAlarmLevel(IN int DeviceID, IN int HeadNo, IN int AlarmLevel); |
| | | |
| | | // Starting the ABLE Calibration |
| | | /// |
| | | /// \brief SGIF_AbleStart Ableæ ¡åå¼å§ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_AbleStart(IN int DeviceID, IN int HeadNo); |
| | | |
| | | // Finishing the ABLE Calibration |
| | | /// |
| | | /// \brief SGIF_AbleStop Ableæ ¡å宿 |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_AbleStop(IN int DeviceID); |
| | | |
| | | // Stopping the ABLE Calibration |
| | | /// |
| | | /// \brief SGIF_AbleCancel AbleУ׼ֹͣ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_AbleCancel(IN int DeviceID); |
| | | |
| | | // Set Mounting Mode |
| | | /// |
| | | /// \brief SGIF_SetReflectionMode å®è£
模å¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param ReflectionMode åå°æ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetReflectionMode(IN int DeviceID, IN int HeadNo, IN SGIF_REFLECTIONMODE ReflectionMode); |
| | | |
| | | // Set Mask |
| | | /// |
| | | /// \brief SGIF_SetMask å±è½è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \param HeadNo ç¹ä½1 |
| | | /// \param HeadNo ç¹ä½2 |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMask(IN int DeviceID, IN int HeadNo, IN BOOL OnOff, IN int Pos1, IN int Pos2); |
| | | |
| | | // Set Median |
| | | /// |
| | | /// \brief SGIF_SetMedian ä¸ä½æ°è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Median ä¸ä½æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMedian(IN int DeviceID, IN int HeadNo, IN SGIF_MEDIAN Median); |
| | | |
| | | // Set LASER CTRL group |
| | | /// |
| | | /// \brief SGIF_SetLaserCtrlGroup Laser Ctrlç»è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param LaserCtrlGroup Laser Ctrlç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetLaserCtrlGroup(IN int DeviceID, IN int HeadNo, IN SGIF_LASER_CTRL_GROUP LaserCtrlGroup); |
| | | |
| | | // Set Mutual interference prevention group |
| | | /// |
| | | /// \brief SGIF_SetMutualInterferencePreventionGroup 鲿¢äºç¸å¹²æ°ç»è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Group ç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMutualInterferencePreventionGroup(IN int DeviceID, IN int HeadNo, IN SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP Group); |
| | | |
| | | // Set Calculation method |
| | | /// |
| | | /// \brief SGIF_SetCalcMethod è®¡ç®æ¹å¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcMethod è®¡ç®æ¹æ³ |
| | | /// \param HeadOutNo ä¼ æå¤´è¾åºç¼å· |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetCalcMethod(IN int DeviceID, IN int OutNo, IN SGIF_CALCMETHOD CalcMethod, IN int HeadOutNo); |
| | | |
| | | // Set Surface to be measured |
| | | /// |
| | | /// \brief SGIF_SetCalcTarget æµéç®æ è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcTarget è®¡ç®æ ç¾ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetCalcTarget(IN int DeviceID, IN int OutNo, IN SGIF_CALCTARGET CalcTarget); |
| | | |
| | | // Set OUT to be calculated (ADD, SUB) |
| | | /// |
| | | /// \brief SGIF_SetOutAddSub å¾
计ç®çOUT(Add,Sub)è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param AddSub1 å¾
计ç®çOUT |
| | | /// \param AddSub2 å¾
计ç®çOUT |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetOutAddSub(IN int DeviceID, IN int OutNo, IN int AddSub1, IN int AddSub2); |
| | | |
| | | // Set OUT to be calculated (AVE, MAX, MIN, P-P) |
| | | /// |
| | | /// \brief SGIF_SetOutOperation å¾
计ç®çOUT(Ave,Max,Min,P-P)è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param TargetOut å¤ä¸ªOUTç»å |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetOutOperation(IN int DeviceID, IN int OutNo, IN SGIF_OUTNO TargetOut); |
| | | |
| | | // Set Scaling |
| | | /// |
| | | /// \brief SGIF_SetScaling 缩æ¾è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param InputValue1 ç¹1çæµéå¼ï¼è¾å
¥å¼ï¼ï¼ä¼ æææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param OutputValue1 ç¹1çæ¾ç¤ºå¼ï¼è¾åºå¼ï¼ï¼ä¼ æææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param InputValue2 ç¹2çæµéå¼ï¼è¾å
¥å¼ï¼ï¼ä¼ æææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param OutputValue2 ç¹2çæ¾ç¤ºå¼ï¼è¾åºå¼ï¼ï¼ä¼ æææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetScaling(IN int DeviceID, IN int OutNo, IN int InputValue1, IN int OutputValue1, IN int InputValue2, IN int OutputValue2); |
| | | |
| | | // Set Filter Mode |
| | | /// |
| | | /// \brief SGIF_SetFilter 滤波å¨è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param FilterMode æ»¤æ³¢æ¨¡å¼ |
| | | /// \param FilterPara æ»¤æ³¢åæ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetFilter(IN int DeviceID, IN int OutNo, IN SGIF_FILTERMODE FilterMode, IN SGIF_FILTERPARA FilterPara); |
| | | |
| | | // Set Trigger Mode |
| | | /// |
| | | /// \brief SGIF_SetTriggerMode è§¦åæ¨¡å¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param TriggerMode è§¦åæ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetTriggerMode(IN int DeviceID, IN int OutNo, IN SGIF_TRIGGERMODE TriggerMode); |
| | | |
| | | // Set Offset |
| | | /// |
| | | /// \brief SGIF_SetOffset åç§»è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param Offset åç§»é |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetOffset(IN int DeviceID, IN int OutNo, IN int Offset); |
| | | |
| | | // Set Calculation Mode |
| | | /// |
| | | /// \brief SGIF_SetCalcMode æ£æµæ¨¡å¼ï¼æµé模å¼ï¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcMode æ£æµæ¨¡å¼ç¼å· |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetCalcMode(IN int DeviceID, IN int OutNo, IN SGIF_CALCMODE CalcMode); |
| | | |
| | | // Set Minimum Display Unit |
| | | /// |
| | | /// \brief SGIF_SetDisplayUnit è®¾å®æ¾ç¤ºåä½è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param DisplayUnit æ¾ç¤ºåä½ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetDisplayUnit(IN int DeviceID, IN int OutNo, IN SGIF_DISPLAYUNIT DisplayUnit); |
| | | |
| | | // Set Synchronization |
| | | /// |
| | | /// \brief SGIF_SetSynchronization åæ¥è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetSynchronization(IN int DeviceID, IN int OutNo, IN BOOL OnOff); |
| | | |
| | | // Set Storage (OUT No. specification) |
| | | /// |
| | | /// \brief SGIF_SetStorageTarget åå¨ï¼OUTç¼å·è§æ ¼ï¼è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetStorageTarget(IN int DeviceID, IN int OutNo, IN BOOL OnOff); |
| | | |
| | | // Set Sampling Rate |
| | | /// |
| | | /// \brief SGIF_SetSamplingCycle éæ ·å¨æè®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param SamplingCycle éæ ·å¨æ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetSamplingCycle(IN int DeviceID, IN SGIF_SAMPLINGCYCLE SamplingCycle); |
| | | |
| | | // Set Mutual Interference Prevention |
| | | /// |
| | | /// \brief SGIF_SetMutualInterferencePrevention 鲿¢äºç¸å¹²æ°ç»è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OnOff ç»è®¾å® |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMutualInterferencePrevention(IN int DeviceID, IN SGIF_MUTUAL_INTERFERENCE_PREVENTION OnOff); |
| | | |
| | | // Set Strobe Time |
| | | /// |
| | | /// \brief SGIF_SetStrobeTime ééæ¶é´è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param StrobeTime ééæ¶é´ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetStrobeTime(IN int DeviceID, IN SGIF_STOROBETIME StrobeTime); |
| | | |
| | | // Set Data Storage |
| | | /// |
| | | /// \brief SGIF_SetDataStorage æ°æ®åå¨è®¾å® |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param NumStorage å¾
å卿°æ®çç¼å· |
| | | /// \param StorageCycle åå¨å¨æ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetDataStorage(IN int DeviceID, IN int NumStorage, IN SGIF_STORAGECYCLE StorageCycle); |
| | | |
| | | // EncoderSetting |
| | | /// |
| | | /// \brief SGIF_SetRunningMode è¿è¡æ¨¡å¼è®¾ç½®(䏿¯æSCI设å¤) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param runningmode è¿è¡æ¨¡å¼ 0:OFF/1:宿¶/2:触å |
| | | /// \param CatchDirection æ£æµæ¹å 0:æ£è´è®¡æ¶/1:æ£è®¡æ¶/2:è´è®¡æ¶ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetRunningMode(IN int DeviceID, IN SGIF_EmRunningMode Runningmode, IN SGIF_EmDirection CatchDirection); |
| | | |
| | | |
| | | // EncoderInputSetting |
| | | /// |
| | | /// \brief SGIF_SetEncoderMode ç¼ç å¨è¾å
¥æ¨¡å¼è®¾ç½®(䏿¯æSCI设å¤) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param Inputmode è¿è¡æ¨¡å¼ 0:1ç¸1éå¢/1:2ç¸1éå¢/2:2ç¸2éå¢,3:2ç¸4éå¢ |
| | | /// \param MinInputTime æå°è¾å
¥æ¶é´ |
| | | /// \param TrigInterval 触åé´é |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | |
| | | EXP RC WINAPI SGIF_SetEncoderMode(IN int DeviceID, IN SGIF_EmEncoderInput Inputmode,IN SGIF_EmInputTime InputTime,IN int TrigInterval); |
| | | |
| | | // SGIF_SetFormula |
| | | /// |
| | | /// \brief SGIF_SetFormula 设置é
æ¹ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param filePath é
æ¹è·¯å¾ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// derive |
| | | |
| | | EXP RC WINAPI SGIF_SetFormula(IN int DeviceID, IN char* filePath ); |
| | | |
| | | // SGIF_SetFormula |
| | | /// |
| | | /// \brief SGIF_SetFormula 设置é
æ¹ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param filePath é
æ¹è·¯å¾ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_DeriveFormula(IN int DeviceID, IN char* filePath); |
| | | /////////////////////////////////////////////// |
| | | // Setting confirmation commands |
| | | // |
| | | // Get Tolerance |
| | | /// |
| | | /// \brief SGIF_GetTolerance å
¬å·®è®¾å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param UpperLimit ä¸éï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param LowerLimit ä¸éï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param Hysteresis æ»åï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetTolerance(IN int DeviceID, IN int OutNo, OUT int * UpperLimit, OUT int * LowerLimit, OUT int * Hysteresis); |
| | | |
| | | // Get ABLE |
| | | /// |
| | | /// \brief SGIF_GetAbleMode Able设å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AbleMode Ableģʽ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetAbleMode(IN int DeviceID, IN int HeadNo, OUT SGIF_ABLEMODE * AbleMode); |
| | | |
| | | // Get ABLE Control Range |
| | | /// |
| | | /// \brief SGIF_GetAbleMinMax Ableæ§å¶èå´è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Min æå°å¼ |
| | | /// \param Max æå¤§å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetAbleMinMax(IN int DeviceID, IN int HeadNo, OUT int * Min, OUT int * Max); |
| | | |
| | | // Get Detection mode |
| | | /// |
| | | /// \brief SGIF_GetMeasureMode æµé模å¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param MeasureMode æµéæ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetMeasureMode(IN int DeviceID, IN int HeadNo, OUT SGIF_MEASUREMODE * MeasureMode); |
| | | |
| | | // Get Base point |
| | | /// |
| | | /// \brief SGIF_GetBasicPoint åºåç¹è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param BasicPoint åºåç¹ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetBasicPoint(IN int DeviceID, IN int HeadNo, OUT SGIF_BASICPOINT * BasicPoint); |
| | | |
| | | // Get Number of Times of Alarm Processing |
| | | /// |
| | | /// \brief SGIF_GetNumAlarm è¦æ¥å¤ç次æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AlarmNum è¦æ¥æ¬¡æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetNumAlarm(IN int DeviceID, IN int HeadNo, OUT int * AlarmNum); |
| | | |
| | | // Get Number of Times of Alarm Recovery |
| | | /// |
| | | /// \brief SGIF_GetNumRecovery è¦æ¥æ¢å¤æ¬¡æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param RecoveryNum æ¢å¤æ¬¡æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetNumRecovery(IN int DeviceID, IN int HeadNo, OUT int * RecoveryNum); |
| | | |
| | | // Get Alarm Level |
| | | /// |
| | | /// \brief SGIF_GetAlarmLevel è¦æ¥çº§å«è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param AlarmLevel è¦æ¥çº§å« |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetAlarmLevel(IN int DeviceID, IN int HeadNo, OUT int * AlarmLevel); |
| | | |
| | | // Get Mounting Mode |
| | | /// |
| | | /// \brief SGIF_GetReflectionMode å®è£
模å¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param ReflectionMode åå°æ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetReflectionMode(IN int DeviceID, IN int HeadNo, OUT SGIF_REFLECTIONMODE * ReflectionMode); |
| | | |
| | | // Get Mask |
| | | /// |
| | | /// \brief SGIF_GetMask å±è½è®¾å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \param Pos1 ä½ç½®1 |
| | | /// \param Pos2 ä½ç½®2 |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetMask(IN int DeviceID, IN int HeadNo, OUT BOOL * OnOff, OUT int * Pos1, OUT int * Pos2); |
| | | |
| | | // Get Median |
| | | /// |
| | | /// \brief SGIF_GetMedian ä¸ä½æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Median ä¸ä½æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetMedian(IN int DeviceID, IN int HeadNo, OUT SGIF_MEDIAN * Median); |
| | | |
| | | // Get LASER CTRL group |
| | | /// |
| | | /// \brief SGIF_GetLaserCtrlGroup Laser Ctrlç»è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param LaserCtrlGroup Laser Ctrlç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetLaserCtrlGroup(IN int DeviceID, IN int HeadNo, OUT SGIF_LASER_CTRL_GROUP * LaserCtrlGroup); |
| | | |
| | | // Get Mutual interference prevention group |
| | | /// |
| | | /// \brief SGIF_GetMutualInterferencePreventionGroup 鲿¢äºç¸å¹²æ°ç»è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo ä¼ æå¤´ç¼å· |
| | | /// \param Group ç» |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetMutualInterferencePreventionGroup(IN int DeviceID, IN int HeadNo, OUT SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP * Group); |
| | | |
| | | // Get Calculation method |
| | | /// |
| | | /// \brief SGIF_GetCalcMethod è®¡ç®æ¹å¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcMethod è®¡ç®æ¹æ³ |
| | | /// \param HeadOutNo ä¼ æå¤´æOUTç¼å· |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcMethod(IN int DeviceID, IN int OutNo, OUT SGIF_CALCMETHOD * CalcMethod, OUT int * HeadOutNo); |
| | | |
| | | // Get Surface to be measured |
| | | /// |
| | | /// \brief SGIF_GetCalcTarget æµéç®æ è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcTarget è®¡ç®æ ç¾ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcTarget(IN int DeviceID, IN int OutNo, OUT SGIF_CALCTARGET * CalcTarget); |
| | | |
| | | // Get OUT to be calculated (ADD, SUB) |
| | | /// |
| | | /// \brief SGIF_GetOutAddSub å¾
计ç®çOUT(Add,Sub)è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param AddSub1 å¾
计ç®çOUTç¼å·1 |
| | | /// \param AddSub2 å¾
计ç®çOUTç¼å·2 |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetOutAddSub(IN int DeviceID, IN int OutNo, OUT int * AddSub1, OUT int * AddSub2); |
| | | |
| | | // Get OUT to be calculated (AVE, MAX, MIN, P-P) |
| | | /// |
| | | /// \brief SGIF_GetOutOperation å¾
计ç®çOUT(Ave,Max,Min,P-P)è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param TargetOut å¤ä¸ªOUTæHEADç»å |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetOutOperation(IN int DeviceID, IN int OutNo, OUT SGIF_OUTNO * TargetOut); |
| | | |
| | | // Get Scaling |
| | | /// |
| | | /// \brief SGIF_GetScaling 缩æ¾è®¾å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param InputValue1 ç¹1çæµéå¼ï¼è¾å
¥å¼ï¼ï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param OutputValue1 ç¹1çæ¾ç¤ºå¼ï¼è¾åºå¼ï¼ï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param InputValue2 ç¹2çæµéå¼ï¼è¾å
¥å¼ï¼ï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \param OutputValue2 ç¹2çæ¾ç¤ºå¼ï¼è¾åºå¼ï¼ï¼ä¼ åºä¸ºæææ°åï¼å»æå°æ°ç¹åçæ´å½¢ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetScaling(IN int DeviceID, IN int OutNo, OUT int * InputValue1, OUT int * OutputValue1, OUT int * InputValue2, OUT int * OutputValue2); |
| | | |
| | | // Get Filter Mode |
| | | /// |
| | | /// \brief SGIF_GetFilter 滤波å¨è®¾å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param FilterMode æ»¤æ³¢å¨æ¨¡å¼ |
| | | /// \param FilterPara æ»¤æ³¢åæ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetFilter(IN int DeviceID, IN int OutNo, OUT SGIF_FILTERMODE * FilterMode, OUT SGIF_FILTERPARA * FilterPara); |
| | | |
| | | // Get Trigger Mode |
| | | /// |
| | | /// \brief SGIF_GetTriggerMode è§¦åæ¨¡å¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param TriggerMode è§¦åæ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetTriggerMode(IN int DeviceID, IN int OutNo, OUT SGIF_TRIGGERMODE * TriggerMode); |
| | | |
| | | // Get Offset |
| | | /// |
| | | /// \brief SGIF_GetOffset åç§»è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param Offset åç§»é |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetOffset(IN int DeviceID, IN int OutNo, OUT int * Offset); |
| | | |
| | | // Get Calculation Mode |
| | | /// |
| | | /// \brief SGIF_GetCalcMode æ£æµæ¨¡å¼ï¼æµé模å¼ï¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param CalcMode æµéæ¨¡å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetCalcMode(IN int DeviceID, IN int OutNo, OUT SGIF_CALCMODE * CalcMode); |
| | | |
| | | // Get Minimum Display Unit |
| | | /// |
| | | /// \brief SGIF_GetDisplayUnit æ¾ç¤ºæå°åä½è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param DisplayUnit æ¾ç¤ºæå°åä½ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetDisplayUnit(IN int DeviceID, IN int OutNo, OUT SGIF_DISPLAYUNIT * DisplayUnit); |
| | | |
| | | // Get Synchronization |
| | | /// |
| | | /// \brief SGIF_GetSynchronization åæ¥è®¾å®è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetSynchronization(IN int DeviceID, IN int OutNo, OUT BOOL * OnOff); |
| | | |
| | | // Get Storage (OUT No. specification) |
| | | /// |
| | | /// \brief SGIF_GetStorageTarget åå¨ï¼OUTç¼å·è®¾å®ï¼è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo è¾åºOUTç¼å· |
| | | /// \param OnOff å¼å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetStorageTarget(IN int DeviceID, IN int OutNo, OUT BOOL * OnOff); |
| | | |
| | | // Get Sampling Rate |
| | | /// |
| | | /// \brief SGIF_GetSamplingCycle éæ ·å¨æè·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param SamplingCycle éæ ·å¨æ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetSamplingCycle(IN int DeviceID, OUT SGIF_SAMPLINGCYCLE * SamplingCycle); |
| | | |
| | | // Get Mutual Interference Prevention |
| | | /// |
| | | /// \brief SGIF_GetMutualInterferencePrevention 鲿¢äºç¸å¹²æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OnOff å¼å
³ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetMutualInterferencePrevention(IN int DeviceID, OUT SGIF_MUTUAL_INTERFERENCE_PREVENTION * OnOff); |
| | | |
| | | // Get Strobe Time |
| | | /// |
| | | /// \brief SGIF_GetStrobeTime ééæ¶é´è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutputFormat è¾åºå½¢å¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetStrobeTime(IN int DeviceID, OUT SGIF_STOROBETIME * StrobeTime); |
| | | |
| | | // Get Data Storage |
| | | /// |
| | | /// \brief SGIF_GetDataStorage æ°æ®åå¨è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param NumStorage 带å卿°æ®ç¼å· |
| | | /// \param StorageCycle åå¨å¨æ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetDataStorage(IN int DeviceID, OUT int * NumStorage, OUT SGIF_STORAGECYCLE * StorageCycle); |
| | | |
| | | // Get Active head count |
| | | /// |
| | | /// \brief SGIF_GetNumOfUsedHeads 主å¨OUT计æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param NumOfUsedHeads 主å¨OUT/ä¼ æå¤´è®¡æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetNumOfUsedHeads(IN int DeviceID, OUT int * NumOfUsedHeads); |
| | | |
| | | // Get Active OUT count |
| | | /// |
| | | /// \brief SGIF_GetNumOfUsedOut 主å¨ä¼ æå¤´è®¡æ°è·å |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param NumOfUsedHeads 主å¨OUT/ä¼ æå¤´è®¡æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetNumOfUsedOut(IN int DeviceID, OUT int * NumOfUsedOut); |
| | | |
| | | // Get Active Running Time |
| | | /// |
| | | /// \brief SGIF_GetDeviceRuningTime è·åç¸æºè¿è¡æ¶é¿ï¼åä½s |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param HeadNo 0:æ§å¶å¨ï¼ 1-4ï¼ä¼ æå¤´ç¼å· |
| | | /// \param RuningTime è¿è¡æ¶é´ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetDeviceRuningTime(IN int DeviceID, IN int HeadNo, OUT unsigned int * RuningTime); |
| | | |
| | | /////////////////////////////////////////////// |
| | | // Other commands |
| | | // |
| | | // Opens the Ethernet device. |
| | | /// |
| | | /// \brief SGIF_OpenDeviceETHER æå¼è®¾å¤ç½ç»è¿æ¥ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OpenParam ç½ç»è¿æ¥åæ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_OpenDeviceETHER(IN int DeviceID, SGIF_OPENPARAM_ETHERNET * OpenParam,DWORD TIMEOUT=3); |
| | | |
| | | // Closes the currently open device. |
| | | /// |
| | | /// \brief SGIF_CloseDevice å
³é设å¤ç½ç»è¿æ¥ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_CloseDevice(IN int DeviceID); |
| | | |
| | | /////////////////////////////////////////////// |
| | | // Mode change commands |
| | | // |
| | | // Mode Switch |
| | | /// |
| | | /// \brief SGIF_SetMode 模å¼åæ¢ |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param Mode ģʽ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetMode(IN int DeviceID, IN SGIF_MODE Mode); |
| | | |
| | | EXP RC WINAPI SGIF_Refresh(IN int DeviceID); |
| | | |
| | | //////////////////////////////////////////////䏿¬¡åè°ç¸å
³/////////////////////////////////////// |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutBuffer æ°æ®æ°ç» |
| | | /// \param NumReceived å®é
æ¥æ¶çæ°æ®ä¸ªæ° |
| | | /// |
| | | typedef void(*SGIF_DataStorageOneTimeCallBack)(OUT int DeviceID); |
| | | |
| | | /////////////////////////////////////////////// |
| | | /// \brief SGIF_SetOneDataStorage 注å䏿¬¡åè° |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param SGIF_BatchOneTimeCallBack åè°å½æ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetOneDataStorage(IN int DeviceID, IN SGIF_DataStorageOneTimeCallBack CallFunc); |
| | | ////////////////////////////////////////////////////////////////////////////////////////////// |
| | | |
| | | // Get encoder store value |
| | | /// \brief SGIF_GetEncoderStoreValueç¼ç å¨å¼å卿°æ®è¾åº(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å· |
| | | /// \param NumOfBuffer ç¼å²åºå¤§å°ï¼æå¤å¯æ¥åå¤å°ä¸ªæ°æ®ï¼ |
| | | /// \param OutBuffer æ°æ®æ°ç» |
| | | /// \param NumReceived å®é
æ¥æ¶çæ°æ®ä¸ªæ° |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetEncoderStoreValue(IN int DeviceID, IN int OutNo, IN int NumOfBuffer, OUT int * OutBuffer, OUT int *NumReceived); |
| | | |
| | | // Get encoder value |
| | | /// \brief SGIF_GetEncoderCurrentValue 读åç¼ç å¨å½åå¼(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å·(1-3) |
| | | /// \param OutBuffer æ°æ®æé |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetEncoderCurrentValue(IN int DeviceID, IN int OutNo, OUT int * OutBuffer); |
| | | |
| | | // encoder Reset |
| | | /// \brief SGIF_EncoderReset ç¼ç å¨å¼ç½®é¶(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å·(1-3) |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_EncoderReset(IN int DeviceID, IN int OutNo); |
| | | |
| | | // Set Encoder Number |
| | | /// \brief SGIF_SetEncoderNumber éæ©ç¼ç å¨(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å·(1-3) |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetEncoderNumber(IN int DeviceID, IN int OutNo); |
| | | |
| | | // Get encoder number |
| | | /// \brief SGIF_GetEncoderNumber 读å设置çç¼ç å¨ç¼å·(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutBuffer æ°æ®æé |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetEncoderNumber(IN int DeviceID, OUT int * OutBuffer); |
| | | |
| | | //Set Encoder Parameters |
| | | /// \brief SGIF_SetEncoderParameters设置ç¼ç å¨åæ°(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å·(1-3) |
| | | /// \param InputMode è¾å
¥æ¨¡å¼ï¼0-3ï¼ |
| | | /// \param InputTime æä½è¾å
¥æ¶é´ï¼100,200,500,1000,2000,5000,10000,20000ï¼(ns) |
| | | /// \param interval é´éï¼1-10000ï¼ |
| | | /// \param OperatingMode è¿è¡æ¨¡å¼ï¼0-2ï¼ |
| | | /// \param DetectionDirection æ£æµæ¹åï¼0-2ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetEncoderParameters(IN int DeviceID, IN int OutNo, IN int InputMode, IN int InputTime, IN int interval, IN int OperatingMode, IN int DetectionDirection); |
| | | |
| | | //Get Encoder Parameters |
| | | /// \brief SGIF_GetEncoderParameters读åç¼ç å¨åæ°(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo ç¼ç å¨ç¼å·(1-3) |
| | | /// \param InputMode è¾å
¥æ¨¡å¼ï¼0-3ï¼ |
| | | /// \param InputTime æä½è¾å
¥æ¶é´ï¼100,200,500,1000,2000,5000,10000,20000ï¼(ns) |
| | | /// \param interval é´éï¼1-10000ï¼ |
| | | /// \param OperatingMode è¿è¡æ¨¡å¼ï¼0-2ï¼ |
| | | /// \param DetectionDirection æ£æµæ¹åï¼0-2ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetEncoderParameters(IN int DeviceID, IN int OutNo, OUT int * InputMode, OUT int * InputTime, OUT int * interval, OUT int * OperatingMode, OUT int * DetectionDirection); |
| | | |
| | | //Set Analog Output |
| | | /// \brief SGIF_SetAnalogOutput 设置模æéè¾åº(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo 模æéç¼å·(1-3) |
| | | /// \param OutputChannel è¾åºééï¼0-3ï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetAnalogOutput(IN int DeviceID, IN int OutNo, IN int OutputChannel); |
| | | |
| | | // Retrieve Analog Output Channel Number |
| | | /// \brief SGIF_GetAnalogOutputChannel è·å模æéè¾åºééç¼å·(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo 模æéç¼å·(1-3) |
| | | /// \param OutBuffer æ°æ®æé |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetAnalogOutputChannel(IN int DeviceID, IN int OutNo, OUT int * OutBuffer); |
| | | |
| | | //Set IO Digital Output |
| | | /// \brief SGIF_SetIODigitalOutput 设置IOæ°åè¾åº(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo æ°åè¾åºç¼å·(1-4) |
| | | /// \param Level è¾åºä½æ°ï¼0:OFF,1:HI,2:GO,3:LO,4:STROBEï¼ |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_SetIODigitalOutput(IN int DeviceID, IN int OutNo, IN int Level); |
| | | |
| | | // Retrieve IO Digital Output Channel Number |
| | | /// \brief SGIF_GetIOOutputChannel è·åIOæ°åéè¾åºééç¼å·(ä»
SCIè®¾å¤æ¯æ) |
| | | /// \param DeviceID 设å¤IDå·ï¼èå´ä¸º0-63. |
| | | /// \param OutNo æ°åè¾åºç¼å·(1-4) |
| | | /// \param OutBuffer æ°æ®æé |
| | | /// \return |
| | | /// >0: 失败. |
| | | /// =0: æå. |
| | | /// |
| | | EXP RC WINAPI SGIF_GetIOOutputChannel(IN int DeviceID, IN int OutNo, OUT int * OutBuffer); |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "pch.h" |
| | | #include "Logger.h" |
| | | |
| | | CLogger& CLogger::Instance() |
| | | { |
| | | static CLogger instance; |
| | | return instance; |
| | | } |
| | | |
| | | CLogger::CLogger() |
| | | { |
| | | OpenLogFile(); |
| | | } |
| | | |
| | | CLogger::~CLogger() |
| | | { |
| | | CloseLogFile(); |
| | | } |
| | | |
| | | void CLogger::OpenLogFile() |
| | | { |
| | | CSingleLock lock(&m_csLogLock, TRUE); |
| | | |
| | | CTime now = CTime::GetCurrentTime(); |
| | | CString strLogDir = _T("Log"); |
| | | |
| | | if (!PathFileExists(strLogDir)) { |
| | | CreateDirectory(strLogDir, NULL); |
| | | } |
| | | |
| | | CString strNewPath; |
| | | strNewPath.Format(_T("%s\\SG_%04d%02d%02d.log"), strLogDir, now.GetYear(), now.GetMonth(), now.GetDay()); |
| | | |
| | | if (m_strCurrentLogPath.CompareNoCase(strNewPath) != 0 || m_logFile.m_pStream == nullptr) { |
| | | if (m_logFile.m_pStream) { |
| | | m_logFile.Flush(); |
| | | m_logFile.Close(); |
| | | } |
| | | |
| | | if (m_logFile.Open(strNewPath, |
| | | CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::typeBinary)) { |
| | | |
| | | if (m_logFile.GetLength() == 0) { |
| | | WCHAR bom = 0xFEFF; |
| | | m_logFile.Write(&bom, sizeof(WCHAR)); |
| | | } |
| | | |
| | | m_logFile.SeekToEnd(); |
| | | m_strCurrentLogPath = strNewPath; |
| | | } |
| | | } |
| | | } |
| | | |
| | | void CLogger::WriteLine(CString str) |
| | | { |
| | | CSingleLock lock(&m_csLogLock, TRUE); |
| | | |
| | | OpenLogFile(); |
| | | |
| | | if (m_logFile.m_pStream) { |
| | | CTime now = CTime::GetCurrentTime(); |
| | | CString strTime; |
| | | strTime.Format(_T("[%02d:%02d:%02d]"), now.GetHour(), now.GetMinute(), now.GetSecond()); |
| | | |
| | | CString strLine = strTime + str + _T("\r\n"); |
| | | m_logFile.Write((LPCTSTR)strLine, strLine.GetLength() * sizeof(WCHAR)); |
| | | } |
| | | } |
| | | |
| | | void CLogger::CloseLogFile() |
| | | { |
| | | CSingleLock lock(&m_csLogLock, TRUE); |
| | | |
| | | if (m_logFile.m_pStream) { |
| | | m_logFile.Flush(); |
| | | m_logFile.Close(); |
| | | m_strCurrentLogPath.Empty(); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include <afx.h> |
| | | |
| | | class CLogger |
| | | { |
| | | public: |
| | | static CLogger& Instance(); // è·ååä¾ |
| | | void WriteLine(CString str); // åä¸è¡æ¥å¿ |
| | | void CloseLogFile(); // å
³éæ¥å¿æä»¶ |
| | | |
| | | private: |
| | | CLogger(); |
| | | ~CLogger(); |
| | | void OpenLogFile(); // å
鍿弿件 |
| | | |
| | | CCriticalSection m_csLogLock; |
| | | CString m_strCurrentLogPath; |
| | | CStdioFile m_logFile; |
| | | }; |
| | | |
| | | #define LOG_LINE(x) CLogger::Instance().WriteLine(x) |
| | | |
| | | #define LOG_LINEF(fmt, ...) \ |
| | | do { \ |
| | | CString __log__; \ |
| | | __log__.Format(fmt, __VA_ARGS__); \ |
| | | CLogger::Instance().WriteLine(__log__); \ |
| | | } while (0) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "pch.h" |
| | | #include "PLCSignalListener.h" |
| | | |
| | | // === æ¥å¿æå°ç±»å === |
| | | #define LOG_TYPE_ERROR -1 |
| | | #define LOG_TYPE_SUCCESS 0 |
| | | #define LOG_TYPE_WARNING 1 |
| | | #define LOG_TYPE_NORMAL 2 |
| | | |
| | | // === æ¥å¿æå°å®å®ä¹ === |
| | | #define LOG_MSG(msg, type) LogInfo(msg, type) |
| | | |
| | | // === PLC å¿è·³ç¸å
³é
ç½® === |
| | | #define PLC_HEARTBEAT_PC_TO_PLC_ADDR 0x107F // PC -> PLCï¼PC åå
¥å¿è·³ |
| | | #define PLC_HEARTBEAT_PLC_TO_PC_ADDR 0x6C40 // PLC -> PCï¼PC 读å PLC åå
¥çå¿è·³ |
| | | #define MAX_MISSED_HEARTBEAT 5 // å
许è¿ç»ä¸¢å¤±å¿è·³çæå¤§æ¬¡æ°ï¼è¶
è¿åå¤å® PLC æçº¿ |
| | | |
| | | // === PLC å½ä»¤è¾å
¥é
ç½®ï¼PLC -> PCï¼ === |
| | | #define PLC_CMD_BIT_START 0x6CD3 // PLCå½ä»¤èµ·å§ä½ï¼é常为B6CD3ï¼ |
| | | #define PLC_CMD_BIT_COUNT 2 // æ»å
±å 个å½ä»¤ä½ï¼B6CD3=Start, B6CD4=Stopï¼ |
| | | |
| | | // === PLC åºçè¾åºé
ç½®ï¼PC -> PLCï¼ === |
| | | #define PLC_ACK_MAX_LIFE 25 // PLCååºä¿¡å·æå¤§ä¿ç卿æ°ï¼æ¯å¨æä¸º m_nIntervalMs 毫ç§ï¼ |
| | | #define PLC_ACK_BASE_BIT 0x1060 // PLCåºçèµ·å§å°åï¼B1060表示B6CD3çåºçï¼B1061表示B6CD4çåºçï¼ |
| | | |
| | | // === PLC软å
ä»¶ç±»åå®ï¼ç¨äºåºçãæ°æ®åå
¥ï¼=== |
| | | #define PLC_BIT_DEVICE_TYPE DeviceType::B // 使ä½è®¾å¤ç±»åï¼å¦MãBï¼ |
| | | #define PLC_WORD_DEVICE_TYPE DeviceType::W // åæä½è®¾å¤ç±»åï¼å¦DãWï¼ |
| | | |
| | | // === PLCç»æå¯åå¨å°åé
ç½® === |
| | | #define PLC_RESULT_ADDR_START 0x37B0 // PLCç»æå¯åå¨èµ·å§å°åï¼å¦W37B0ï¼ |
| | | #define PLC_RESULT_ADDR_COUNT 4 // ç»æå¯å卿°éï¼å¦W37B0, W37B2, W37B4, W37B6ï¼ |
| | | |
| | | #define IS_RISING_EDGE(prev, curr) (!(prev) && (curr)) |
| | | |
| | | CPLCSignalListener::CPLCSignalListener() = default; |
| | | |
| | | CPLCSignalListener::~CPLCSignalListener() { |
| | | Stop(); |
| | | } |
| | | |
| | | bool CPLCSignalListener::Initialize(StationIdentifier station, int nIntervalMs/* = 200*/) |
| | | { |
| | | m_pPlc = std::make_unique<CCCLinkIEControl>(); |
| | | if (!m_pPlc) { |
| | | LOG_MSG(_T("PLCæ§å¶å¨åå§åå¤±è´¥ï¼æ æ³å建 CCCLinkIEControl å®ä¾ã"), LOG_TYPE_ERROR); |
| | | return false; |
| | | } |
| | | |
| | | int ret = m_pPlc->Connect(CC_LINK_IE_CONTROL_CHANNEL(1)); |
| | | if (ret != 0) { |
| | | m_bConnected = false; |
| | | |
| | | CString strError; |
| | | strError.Format(_T("PLCæ§å¶å¨è¿æ¥å¤±è´¥ï¼é误ç ï¼%d"), ret); |
| | | LOG_MSG(strError, LOG_TYPE_ERROR); |
| | | |
| | | return false; |
| | | } |
| | | |
| | | m_bConnected = true; |
| | | m_station = station; |
| | | m_nIntervalMs = nIntervalMs; |
| | | |
| | | m_vecPrevBits.assign(PLC_CMD_BIT_COUNT, false); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | void CPLCSignalListener::SetStartCallback(Callback cb) |
| | | { |
| | | m_cbStart = std::move(cb); |
| | | } |
| | | |
| | | void CPLCSignalListener::SetStopCallback(Callback cb) |
| | | { |
| | | m_cbStop = std::move(cb); |
| | | } |
| | | |
| | | void CPLCSignalListener::SetAnalyzeCallback(AnalyzeCallback cb) |
| | | { |
| | | m_cbAnalyze = std::move(cb); |
| | | } |
| | | |
| | | void CPLCSignalListener::SetLogCallback(LogCallback cb) |
| | | { |
| | | m_cbLog = std::move(cb); |
| | | } |
| | | |
| | | bool CPLCSignalListener::Start() |
| | | { |
| | | if (m_bRunning || !m_pPlc) { |
| | | LOG_MSG(_T("PLCä¿¡å·çå¬å¨å·²å¨è¿è¡æPLCæ§å¶å¨æªåå§åã"), LOG_TYPE_ERROR); |
| | | return false; |
| | | } |
| | | |
| | | m_bRunning = true; |
| | | m_thread = std::thread(&CPLCSignalListener::ThreadProc, this); |
| | | |
| | | StartHeartbeatMonitor(); |
| | | return true; |
| | | } |
| | | |
| | | void CPLCSignalListener::Stop() |
| | | { |
| | | m_bRunning = false; |
| | | if (m_thread.joinable()) { |
| | | m_thread.join(); |
| | | } |
| | | |
| | | StopHeartbeatMonitor(); |
| | | } |
| | | |
| | | void CPLCSignalListener::LogInfo(const CString& strText, int nType) |
| | | { |
| | | if (m_cbLog) { |
| | | m_cbLog(strText, nType); |
| | | } |
| | | } |
| | | |
| | | bool CPLCSignalListener::SendHeartbeat() |
| | | { |
| | | if (!m_pPlc || !m_bConnected) { |
| | | return false; |
| | | } |
| | | |
| | | static bool bToggle = false; |
| | | bToggle = !bToggle; |
| | | |
| | | int ret = m_pPlc->WriteBitDataEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_HEARTBEAT_PC_TO_PLC_ADDR, BitContainer{ bToggle }); |
| | | |
| | | return (ret == 0); |
| | | } |
| | | |
| | | bool CPLCSignalListener::CheckHeartbeat() |
| | | { |
| | | static bool bLastHeartbeat = false; |
| | | |
| | | if (!m_pPlc || !m_bConnected) { |
| | | return false; |
| | | } |
| | | |
| | | BitContainer vec; |
| | | int ret = m_pPlc->ReadBitDataEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_HEARTBEAT_PLC_TO_PC_ADDR, 1, vec); |
| | | if (ret != 0 || vec.empty()) { |
| | | return false; |
| | | } |
| | | |
| | | bool bCurrent = vec[0]; |
| | | bool bChanged = (bCurrent != bLastHeartbeat); |
| | | bLastHeartbeat = bCurrent; |
| | | |
| | | return bChanged; |
| | | } |
| | | |
| | | bool CPLCSignalListener::MonitorHeartbeat() |
| | | { |
| | | if (CheckHeartbeat()) { |
| | | m_nMissedHeartbeatCount = 0; |
| | | |
| | | if (m_bHeartbeatLost) { |
| | | m_bHeartbeatLost = false; |
| | | LOG_MSG(_T("PLCå¿è·³æ¢å¤ï¼"), LOG_TYPE_SUCCESS); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | else { |
| | | m_nMissedHeartbeatCount++; |
| | | |
| | | if (m_nMissedHeartbeatCount > MAX_MISSED_HEARTBEAT) { |
| | | if (!m_bHeartbeatLost) { |
| | | m_bHeartbeatLost = true; |
| | | m_nMissedHeartbeatCount = 0; |
| | | LOG_MSG(_T("PLCå¿è·³ä¿¡å·ä¸æï¼"), LOG_TYPE_ERROR); |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | void CPLCSignalListener::StartHeartbeatMonitor() |
| | | { |
| | | m_bHeartbeatRunning = true; |
| | | m_heartbeatThread = std::thread([this]() { |
| | | while (m_bHeartbeatRunning) { |
| | | SendHeartbeat(); |
| | | MonitorHeartbeat(); |
| | | std::this_thread::sleep_for(std::chrono::milliseconds(m_nIntervalMs * 5)); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | void CPLCSignalListener::StopHeartbeatMonitor() |
| | | { |
| | | m_bHeartbeatRunning = false; |
| | | if (m_heartbeatThread.joinable()) { |
| | | m_heartbeatThread.join(); |
| | | } |
| | | } |
| | | |
| | | void CPLCSignalListener::PulseBitDevice(DeviceType eDevType, long nBitNo, int nDelayMs/* = 50*/) |
| | | { |
| | | m_pPlc->SetBitDeviceEx(m_station, eDevType, nBitNo); |
| | | ::Sleep(nDelayMs); |
| | | m_pPlc->ResetBitDeviceEx(m_station, eDevType, nBitNo); |
| | | } |
| | | |
| | | void CPLCSignalListener::HandleAckLife(int i, bool bCurrTriggerBit) |
| | | { |
| | | if (m_vecAckSent[i] && !bCurrTriggerBit) { |
| | | m_pPlc->ResetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, long(PLC_ACK_BASE_BIT + i)); |
| | | m_vecAckSent[i] = false; |
| | | } |
| | | |
| | | if (m_vecAckSent[i]) { |
| | | if (++m_vecAckCounter[i] > PLC_ACK_MAX_LIFE) { |
| | | m_pPlc->ResetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, long(PLC_ACK_BASE_BIT + i)); |
| | | m_vecAckSent[i] = false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | void CPLCSignalListener::ThreadProc() |
| | | { |
| | | while (m_bRunning && m_bConnected) { |
| | | BitContainer vecBits; |
| | | int ret = m_pPlc->ReadBitDataEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_CMD_BIT_START, PLC_CMD_BIT_COUNT, vecBits); |
| | | if (ret != 0 && vecBits.size() != PLC_CMD_BIT_COUNT) { |
| | | ::Sleep(m_nIntervalMs); |
| | | |
| | | CString strError; |
| | | strError.Format(_T("PLC读å使°æ®å¤±è´¥ï¼é误ç ï¼%d"), ret); |
| | | LOG_MSG(strError, LOG_TYPE_ERROR); |
| | | |
| | | continue; |
| | | } |
| | | |
| | | for (int i = 0; i < PLC_CMD_BIT_COUNT; ++i) { |
| | | if (IS_RISING_EDGE(m_vecPrevBits[i], vecBits[i])) { |
| | | // ä¸å沿触å |
| | | switch (i) { |
| | | case 0: |
| | | if (m_cbStart) { |
| | | m_cbStart(); |
| | | WriteOutValues(OutValuesArray{ 0.0, 0.0, 0.0, 0.0 }); |
| | | if (m_pPlc->SetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_ACK_BASE_BIT + i) == 0) { |
| | | m_vecAckSent[i] = true; |
| | | m_vecAckCounter[i] = 0; |
| | | } |
| | | } |
| | | break; |
| | | |
| | | case 1: |
| | | if (m_cbStop) { |
| | | m_cbStop(); |
| | | if (m_pPlc->SetBitDeviceEx(m_station, PLC_BIT_DEVICE_TYPE, PLC_ACK_BASE_BIT + i) == 0) { |
| | | m_vecAckSent[i] = true; |
| | | m_vecAckCounter[i] = 0; |
| | | } |
| | | } |
| | | |
| | | if (m_cbAnalyze) { |
| | | auto results = m_cbAnalyze(); |
| | | WriteOutValues(results); |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | |
| | | HandleAckLife(i, vecBits[i]); |
| | | m_vecPrevBits[i] = vecBits[i]; |
| | | } |
| | | |
| | | ::Sleep(m_nIntervalMs); |
| | | } |
| | | } |
| | | |
| | | bool CPLCSignalListener::WriteOutValues(const OutValuesArray& values) |
| | | { |
| | | if (!m_pPlc || !m_bConnected) { |
| | | LOG_MSG(_T("PLCæªè¿æ¥ææªåå§åï¼æ æ³åå
¥è¾åºå¼ã"), LOG_TYPE_ERROR); |
| | | return false; |
| | | } |
| | | |
| | | if (PLC_RESULT_ADDR_COUNT != 4) { |
| | | LOG_MSG(_T("PLCç»æå¯å卿°éé
ç½®é误ï¼å¿
须为4个ã"), LOG_TYPE_ERROR); |
| | | return false; |
| | | } |
| | | |
| | | for (int i = 0; i < PLC_RESULT_ADDR_COUNT; ++i) { |
| | | // æ¾å¤§100åå¹¶åèäºå
¥ï¼è½¬ä¸ºPLCæ´æ° |
| | | uint16_t nScaled = static_cast<uint16_t>(std::round(values[i] * 100.0)); |
| | | WordContainer vec = { nScaled }; |
| | | |
| | | short nTargetAddr = PLC_RESULT_ADDR_START + i * 2; |
| | | int ret = m_pPlc->WriteWordDataEx(m_station, PLC_WORD_DEVICE_TYPE, nTargetAddr, vec); |
| | | if (ret != 0) { |
| | | CString msg; |
| | | msg.Format(_T("åå
¥OUT%då°å°å%d失败ï¼å¼=%.2f"), i + 1, nTargetAddr, values[i]); |
| | | LOG_MSG(msg, LOG_TYPE_ERROR); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | |
| | | #include "CCLinkIEControl.h" |
| | | |
| | | #include <thread> |
| | | #include <atomic> |
| | | #include <functional> |
| | | #include <vector> |
| | | |
| | | using OutValuesArray = std::array<double, 4>; |
| | | using Callback = std::function<void()>; |
| | | using AnalyzeCallback = std::function<OutValuesArray()>; |
| | | using LogCallback = std::function<void(const CString& strContent, int type)>; |
| | | |
| | | class CPLCSignalListener |
| | | { |
| | | public: |
| | | CPLCSignalListener(); |
| | | ~CPLCSignalListener(); |
| | | |
| | | /** |
| | | * @brief åå§å PLC ä¿¡å·çå¬å¨ã |
| | | * |
| | | * @param station ç®æ PLC çç«å·æ è¯ç¬¦ã |
| | | * @param nIntervalMs è½®è¯¢å¨æï¼åä½ï¼æ¯«ç§ï¼ï¼é»è®¤ 200msã |
| | | * @return true åå§åæåã |
| | | * @return false åå§å失败ã |
| | | */ |
| | | bool Initialize(StationIdentifier station, int nIntervalMs = 200); |
| | | |
| | | /** |
| | | * @brief 设置å¼å§å½ä»¤çåè°å½æ°ï¼å¯¹åº PLC ç Start ä¿¡å·ï¼ã |
| | | * |
| | | * @param cb ç¨æ·èªå®ä¹çå¼å§åè°å½æ°ã |
| | | */ |
| | | void SetStartCallback(Callback cb); |
| | | |
| | | /** |
| | | * @brief è®¾ç½®åæ¢å½ä»¤çåè°å½æ°ï¼å¯¹åº PLC ç Stop ä¿¡å·ï¼ã |
| | | * |
| | | * @param cb ç¨æ·èªå®ä¹ç忢åè°å½æ°ã |
| | | */ |
| | | void SetStopCallback(Callback cb); |
| | | |
| | | /** |
| | | * @brief 设置åæè®¡ç®åè°å½æ°ï¼å¨æ¥æ¶å°åæ¢å½ä»¤åè°ç¨ã |
| | | * |
| | | * @param cb è¿å计ç®ç»ææ°ç»ï¼OUT1~OUT4ï¼ç彿°ã |
| | | */ |
| | | void SetAnalyzeCallback(AnalyzeCallback cb); |
| | | |
| | | /** |
| | | * @brief 设置æ¥å¿è¾åºåè°å½æ°ã |
| | | * |
| | | * @param cb ç¨æ·æä¾çæ¥å¿è¾åºæ¥å£ï¼å
嫿¥å¿å
容忥å¿ç±»åï¼ã |
| | | */ |
| | | void SetLogCallback(LogCallback cb); |
| | | |
| | | /** |
| | | * @brief å¯å¨ä¿¡å·çå¬çº¿ç¨ã |
| | | * |
| | | * @return true å¯å¨æåã |
| | | * @return false å¯å¨å¤±è´¥ï¼å¯è½å·²è¿è¡ææªåå§åï¼ã |
| | | */ |
| | | bool Start(); |
| | | |
| | | /** |
| | | * @brief åæ¢ä¿¡å·çå¬çº¿ç¨ã |
| | | */ |
| | | void Stop(); |
| | | |
| | | /** |
| | | * @brief å PLC åå
¥åæç»æå¼ï¼é常为 OUT1 ~ OUT4ï¼ã |
| | | * |
| | | * @param values å
å«å个 double ç±»åçç»æå¼ï¼å°è½¬æ¢ä¸ºæ´æ°ååå
¥ PLCã |
| | | * @return true åå
¥æåã |
| | | * @return false åå
¥å¤±è´¥ã |
| | | */ |
| | | bool WriteOutValues(const OutValuesArray& values); |
| | | |
| | | private: |
| | | /** |
| | | * @brief è¾åºæ¥å¿ä¿¡æ¯ï¼å°è£
æ¥å¿åè°ï¼ã |
| | | * |
| | | * @param strText æ¥å¿å
å®¹ææ¬ã |
| | | * @param nType æ¥å¿ç±»åï¼LOG_TYPE_NORMAL / ERROR / WARNING çï¼ã |
| | | */ |
| | | void LogInfo(const CString& strText, int nType); |
| | | |
| | | /** |
| | | * @brief å PLC åå
¥å¿è·³ä¿¡å·ï¼äº¤æ¿ä½ï¼ã |
| | | * |
| | | * @return true åå
¥æåã |
| | | * @return false åå
¥å¤±è´¥ï¼å¦æªè¿æ¥ï¼ã |
| | | */ |
| | | bool SendHeartbeat(); |
| | | |
| | | /** |
| | | * @brief æ£æ¥ä» PLC 读åå°çå¿è·³ä¿¡å·æ¯å¦åçååã |
| | | * |
| | | * @return true å¿è·³æååï¼PLC æ£å¸¸å¨çº¿ï¼ã |
| | | * @return false å¿è·³æ ååï¼å¯è½ç¦»çº¿ï¼ã |
| | | */ |
| | | bool CheckHeartbeat(); |
| | | |
| | | /** |
| | | * @brief çæ§ PLC å¿è·³æ¯å¦ä¸æï¼å¹¶èªå¨è®°å½ç¶æã |
| | | * |
| | | * @return true PLC å¨çº¿æå¨å
è®¸çæªååºæ¬¡æ°å
ã |
| | | * @return false PLC å¿è·³ä¸æï¼è¶
è¿å
许éå¼ã |
| | | */ |
| | | bool MonitorHeartbeat(); |
| | | |
| | | /** |
| | | * @brief å¯å¨å¿è·³çæ§çº¿ç¨ï¼ç¬ç«äºä¿¡å·çå¬çº¿ç¨ï¼ã |
| | | */ |
| | | void StartHeartbeatMonitor(); |
| | | |
| | | /** |
| | | * @brief 忢å¿è·³çæ§çº¿ç¨ã |
| | | */ |
| | | void StopHeartbeatMonitor(); |
| | | |
| | | /** |
| | | * @brief åæå®è½¯å
ä»¶ä½åå
¥ä¸ä¸ªèå²ï¼å
å1ï¼å»¶æ¶åèªå¨å0ï¼ã |
| | | * |
| | | * @param eDevType ä½è½¯å
ä»¶ç±»åï¼å¦ M/Bï¼ã |
| | | * @param nBitNo ä½å°åç¼å·ã |
| | | * @param nDelayMs èå²æç»æ¶é´ï¼é»è®¤50毫ç§ã |
| | | */ |
| | | void PulseBitDevice(DeviceType eDevType, long nBitNo, int nDelayMs = 50); |
| | | |
| | | /** |
| | | * @brief 管ç ACK ååºççå½å¨æï¼è¶
æ¶èªå¨æ¸
é¤ã |
| | | * |
| | | * @param i æ§å¶ä½ç´¢å¼ï¼0=Startï¼1=Stopï¼ã |
| | | * @param bCurrTriggerBit å½åä» PLC 读åå°ç触åä½ç¶æã |
| | | */ |
| | | void HandleAckLife(int i, bool bCurrTriggerBit); |
| | | |
| | | /** |
| | | * @brief 主çå¬çº¿ç¨é»è¾ï¼å¾ªç¯è¯»å PLC æ§å¶ä¿¡å·å¹¶å¤ç触åã |
| | | */ |
| | | void ThreadProc(); |
| | | |
| | | private: |
| | | // === PLC éä¿¡æ ¸å¿å¯¹è±¡ === |
| | | std::unique_ptr<CCCLinkIEControl> m_pPlc; // PLC éä¿¡æ§å¶å¨ |
| | | StationIdentifier m_station; // PLC ç«å· |
| | | std::atomic<bool> m_bConnected{ false }; // æ¯å¦æåè¿æ¥ |
| | | |
| | | // === æ§å¶åæ° === |
| | | int m_nIntervalMs = 200; // è½®è¯¢å¨æï¼msï¼ |
| | | |
| | | // === å½ä»¤è§¦åç¶æç¼å === |
| | | std::vector<bool> m_vecPrevBits; // ä¸ä¸å¨æçå½ä»¤ä½ç¶æï¼ç¨äºæ£æµä¸åæ²¿ï¼ |
| | | |
| | | // === åè°å½æ°ï¼æ§å¶/计ç®/æ¥å¿ï¼=== |
| | | Callback m_cbStart; // Start å½ä»¤åè° |
| | | Callback m_cbStop; // Stop å½ä»¤åè° |
| | | AnalyzeCallback m_cbAnalyze; // Analyze 计ç®åè°ï¼è¿å OUT1~OUT4ï¼ |
| | | LogCallback m_cbLog; // æ¥å¿è¾åºåè° |
| | | |
| | | // === ä¸»çº¿ç¨æ§å¶ === |
| | | std::atomic<bool> m_bRunning{ false }; // 主çå¬çº¿ç¨æ¯å¦è¿è¡ |
| | | std::thread m_thread; // 主çå¬çº¿ç¨å¯¹è±¡ |
| | | |
| | | // === ACK ä¿¡å·ç¶æ === |
| | | std::array<bool, 2> m_vecAckSent = { false, false }; // æ¯å¦å·²åéåºçä¿¡å·ï¼B10/B11ï¼ |
| | | std::array<int, 2> m_vecAckCounter = { 0, 0 }; // 对åºåºçä¿¡å·ççå½å¨æè®¡æ°å¨ |
| | | |
| | | // === å¿è·³æ£æµç¸å
³ === |
| | | std::thread m_heartbeatThread; // å¿è·³æ£æµçº¿ç¨å¯¹è±¡ |
| | | std::atomic<bool> m_bHeartbeatRunning = false; // å¿è·³çº¿ç¨è¿è¡æ å¿ |
| | | std::atomic<bool> m_bHeartbeatLost = false; // å¿è·³ä¸¢å¤±æ å¿ |
| | | int m_nMissedHeartbeatCount = 0; // å¿è·³æªå忬¡æ°ï¼ç¨äºæ£æµ PLC æçº¿ï¼ |
| | | }; |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | |  |
| | | // SGMeasurement.cpp: å®ä¹åºç¨ç¨åºçç±»è¡ä¸ºã |
| | | // |
| | | |
| | | #include "pch.h" |
| | | #include "framework.h" |
| | | #include "SGMeasurement.h" |
| | | #include "SGMeasurementDlg.h" |
| | | |
| | | #ifdef _DEBUG |
| | | #define new DEBUG_NEW |
| | | #endif |
| | | |
| | | |
| | | // CSGMeasurementApp |
| | | |
| | | BEGIN_MESSAGE_MAP(CSGMeasurementApp, CWinApp) |
| | | ON_COMMAND(ID_HELP, &CWinApp::OnHelp) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CSGMeasurementApp æé |
| | | |
| | | CSGMeasurementApp::CSGMeasurementApp() |
| | | { |
| | | // æ¯æéæ°å¯å¨ç®¡çå¨ |
| | | m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART; |
| | | |
| | | // TODO: 卿¤å¤æ·»å æé 代ç ï¼ |
| | | // å°ææéè¦çåå§åæ¾ç½®å¨ InitInstance ä¸ |
| | | } |
| | | |
| | | |
| | | // å¯ä¸ç CSGMeasurementApp 对象 |
| | | |
| | | CSGMeasurementApp theApp; |
| | | |
| | | |
| | | // CSGMeasurementApp åå§å |
| | | |
| | | BOOL CSGMeasurementApp::InitInstance() |
| | | { |
| | | // 妿åºç¨ç¨åºåå¨ä»¥ä¸æ
åµï¼Windows XP ä¸éè¦ InitCommonControlsEx() |
| | | // ä½¿ç¨ ComCtl32.dll çæ¬ 6 ææ´é«çæ¬æ¥å¯ç¨å¯è§åæ¹å¼ï¼åéè¦ InitCommonControlsEx()ãå¦åï¼å°æ æ³å建çªå£ã |
| | | INITCOMMONCONTROLSEX InitCtrls; |
| | | InitCtrls.dwSize = sizeof(InitCtrls); |
| | | // å°å®è®¾ç½®ä¸ºå
æ¬ææè¦å¨åºç¨ç¨åºä¸ä½¿ç¨ç |
| | | // å
Œ
±æ§ä»¶ç±»ã |
| | | InitCtrls.dwICC = ICC_WIN95_CLASSES; |
| | | InitCommonControlsEx(&InitCtrls); |
| | | |
| | | CWinApp::InitInstance(); |
| | | |
| | | // åå§å MFC RichEdit æ§ä»¶ |
| | | AfxInitRichEdit2(); |
| | | |
| | | AfxEnableControlContainer(); |
| | | |
| | | // å建 shell 管çå¨ï¼ä»¥é²å¯¹è¯æ¡å
å« |
| | | // ä»»ä½ shell æ è§å¾æ§ä»¶æ shell å表è§å¾æ§ä»¶ã |
| | | CShellManager *pShellManager = new CShellManager; |
| | | |
| | | // æ¿æ´»âWindows Nativeâè§è§ç®¡çå¨ï¼ä»¥ä¾¿å¨ MFC æ§ä»¶ä¸å¯ç¨ä¸»é¢ |
| | | CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); |
| | | |
| | | // æ ååå§å |
| | | // 妿æªä½¿ç¨è¿äºåè½å¹¶å¸æåå° |
| | | // æç»å¯æ§è¡æä»¶ç大å°ï¼ååºç§»é¤ä¸å |
| | | // ä¸éè¦çç¹å®åå§åä¾ç¨ |
| | | // æ´æ¹ç¨äºåå¨è®¾ç½®ç注å表项 |
| | | // TODO: åºéå½ä¿®æ¹è¯¥åç¬¦ä¸²ï¼ |
| | | // ä¾å¦ä¿®æ¹ä¸ºå
¬å¸æç»ç»å |
| | | SetRegistryKey(_T("åºç¨ç¨åºå导çæçæ¬å°åºç¨ç¨åº")); |
| | | |
| | | CSGMeasurementDlg dlg; |
| | | m_pMainWnd = &dlg; |
| | | INT_PTR nResponse = dlg.DoModal(); |
| | | if (nResponse == IDOK) |
| | | { |
| | | // TODO:âç¡®å®âæ¥å
³éå¯¹è¯æ¡ç代ç |
| | | } |
| | | else if (nResponse == IDCANCEL) |
| | | { |
| | | // TODO:âåæ¶âæ¥å
³éå¯¹è¯æ¡ç代ç |
| | | } |
| | | else if (nResponse == -1) |
| | | { |
| | | TRACE(traceAppMsg, 0, "è¦å: å¯¹è¯æ¡å建失败ï¼åºç¨ç¨åºå°æå¤ç»æ¢ã\n"); |
| | | TRACE(traceAppMsg, 0, "è¦å: 妿æ¨å¨å¯¹è¯æ¡ä¸ä½¿ç¨ MFC æ§ä»¶ï¼åæ æ³ #define _AFX_NO_MFC_CONTROLS_IN_DIALOGSã\n"); |
| | | } |
| | | |
| | | // å é¤ä¸é¢å建ç shell 管çå¨ã |
| | | if (pShellManager != nullptr) |
| | | { |
| | | delete pShellManager; |
| | | } |
| | | |
| | | #if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS) |
| | | ControlBarCleanUp(); |
| | | #endif |
| | | |
| | | // ç±äºå¯¹è¯æ¡å·²å
³éï¼æä»¥å°è¿å FALSE 以便éåºåºç¨ç¨åºï¼è䏿¯å¯å¨åºç¨ç¨åºçæ¶æ¯æ³µã |
| | | return FALSE; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | |  |
| | | // SGMeasurement.h: PROJECT_NAME åºç¨ç¨åºç主头æä»¶ |
| | | // |
| | | |
| | | #pragma once |
| | | |
| | | #ifndef __AFXWIN_H__ |
| | | #error "å¨å
嫿¤æä»¶ä¹åå
å« 'pch.h' ä»¥çæ PCH" |
| | | #endif |
| | | |
| | | #include "resource.h" // ä¸»ç¬¦å· |
| | | |
| | | |
| | | // CSGMeasurementApp: |
| | | // æå
³æ¤ç±»çå®ç°ï¼è¯·åé
SGMeasurement.cpp |
| | | // |
| | | |
| | | class CSGMeasurementApp : public CWinApp |
| | | { |
| | | public: |
| | | CSGMeasurementApp(); |
| | | |
| | | // éå |
| | | public: |
| | | virtual BOOL InitInstance(); |
| | | |
| | | // å®ç° |
| | | |
| | | DECLARE_MESSAGE_MAP() |
| | | }; |
| | | |
| | | extern CSGMeasurementApp theApp; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
| | | <ItemGroup Label="ProjectConfigurations"> |
| | | <ProjectConfiguration Include="Debug|Win32"> |
| | | <Configuration>Debug</Configuration> |
| | | <Platform>Win32</Platform> |
| | | </ProjectConfiguration> |
| | | <ProjectConfiguration Include="Release|Win32"> |
| | | <Configuration>Release</Configuration> |
| | | <Platform>Win32</Platform> |
| | | </ProjectConfiguration> |
| | | <ProjectConfiguration Include="Debug|x64"> |
| | | <Configuration>Debug</Configuration> |
| | | <Platform>x64</Platform> |
| | | </ProjectConfiguration> |
| | | <ProjectConfiguration Include="Release|x64"> |
| | | <Configuration>Release</Configuration> |
| | | <Platform>x64</Platform> |
| | | </ProjectConfiguration> |
| | | </ItemGroup> |
| | | <PropertyGroup Label="Globals"> |
| | | <VCProjectVersion>17.0</VCProjectVersion> |
| | | <ProjectGuid>{F8087F20-3A3E-18F2-09E3-9C139642EB58}</ProjectGuid> |
| | | <Keyword>MFCProj</Keyword> |
| | | <RootNamespace>SGMeasurement</RootNamespace> |
| | | <WindowsTargetPlatformVersion>10.0.22621.0</WindowsTargetPlatformVersion> |
| | | </PropertyGroup> |
| | | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> |
| | | <ConfigurationType>Application</ConfigurationType> |
| | | <UseDebugLibraries>true</UseDebugLibraries> |
| | | <PlatformToolset>v141</PlatformToolset> |
| | | <CharacterSet>Unicode</CharacterSet> |
| | | <UseOfMfc>Dynamic</UseOfMfc> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> |
| | | <ConfigurationType>Application</ConfigurationType> |
| | | <UseDebugLibraries>false</UseDebugLibraries> |
| | | <PlatformToolset>v141</PlatformToolset> |
| | | <WholeProgramOptimization>true</WholeProgramOptimization> |
| | | <CharacterSet>Unicode</CharacterSet> |
| | | <UseOfMfc>Dynamic</UseOfMfc> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> |
| | | <ConfigurationType>Application</ConfigurationType> |
| | | <UseDebugLibraries>true</UseDebugLibraries> |
| | | <PlatformToolset>v141</PlatformToolset> |
| | | <CharacterSet>Unicode</CharacterSet> |
| | | <UseOfMfc>Dynamic</UseOfMfc> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> |
| | | <ConfigurationType>Application</ConfigurationType> |
| | | <UseDebugLibraries>false</UseDebugLibraries> |
| | | <PlatformToolset>v141</PlatformToolset> |
| | | <WholeProgramOptimization>true</WholeProgramOptimization> |
| | | <CharacterSet>Unicode</CharacterSet> |
| | | <UseOfMfc>Dynamic</UseOfMfc> |
| | | </PropertyGroup> |
| | | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> |
| | | <ImportGroup Label="ExtensionSettings"> |
| | | </ImportGroup> |
| | | <ImportGroup Label="Shared"> |
| | | </ImportGroup> |
| | | <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
| | | <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
| | | </ImportGroup> |
| | | <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
| | | <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
| | | </ImportGroup> |
| | | <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
| | | <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
| | | </ImportGroup> |
| | | <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
| | | <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
| | | </ImportGroup> |
| | | <PropertyGroup Label="UserMacros" /> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
| | | <LinkIncremental>true</LinkIncremental> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
| | | <LinkIncremental>true</LinkIncremental> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
| | | <LinkIncremental>false</LinkIncremental> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
| | | <LinkIncremental>false</LinkIncremental> |
| | | </PropertyGroup> |
| | | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
| | | <ClCompile> |
| | | <PrecompiledHeader>Use</PrecompiledHeader> |
| | | <WarningLevel>Level3</WarningLevel> |
| | | <SDLCheck>true</SDLCheck> |
| | | <PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
| | | <AdditionalIncludeDirectories>.;..;.\DLL\64bit;.\CCLinkPerformance;..\MELSECSDK\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ClCompile> |
| | | <Link> |
| | | <SubSystem>Windows</SubSystem> |
| | | <AdditionalLibraryDirectories>.\DLL\64bit;..\MELSECSDK\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> |
| | | <AdditionalDependencies>SGIFPJ.lib;MdFunc32.lib;%(AdditionalDependencies)</AdditionalDependencies> |
| | | </Link> |
| | | <Midl> |
| | | <MkTypLibCompatible>false</MkTypLibCompatible> |
| | | <ValidateAllParameters>true</ValidateAllParameters> |
| | | <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | </Midl> |
| | | <ResourceCompile> |
| | | <Culture>0x0804</Culture> |
| | | <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ResourceCompile> |
| | | </ItemDefinitionGroup> |
| | | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
| | | <ClCompile> |
| | | <PrecompiledHeader>Use</PrecompiledHeader> |
| | | <WarningLevel>Level3</WarningLevel> |
| | | <SDLCheck>true</SDLCheck> |
| | | <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
| | | <AdditionalIncludeDirectories>.\DLL\32bit;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ClCompile> |
| | | <Link> |
| | | <SubSystem>Windows</SubSystem> |
| | | <AdditionalLibraryDirectories>.\DLL\32bit;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> |
| | | <AdditionalDependencies>SGIFPJ.lib;%(AdditionalDependencies)</AdditionalDependencies> |
| | | </Link> |
| | | <Midl> |
| | | <MkTypLibCompatible>false</MkTypLibCompatible> |
| | | <ValidateAllParameters>true</ValidateAllParameters> |
| | | <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | </Midl> |
| | | <ResourceCompile> |
| | | <Culture>0x0804</Culture> |
| | | <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ResourceCompile> |
| | | </ItemDefinitionGroup> |
| | | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
| | | <ClCompile> |
| | | <PrecompiledHeader>Use</PrecompiledHeader> |
| | | <WarningLevel>Level3</WarningLevel> |
| | | <FunctionLevelLinking>true</FunctionLevelLinking> |
| | | <IntrinsicFunctions>true</IntrinsicFunctions> |
| | | <SDLCheck>true</SDLCheck> |
| | | <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
| | | <AdditionalIncludeDirectories>.\DLL\32bit;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ClCompile> |
| | | <Link> |
| | | <SubSystem>Windows</SubSystem> |
| | | <EnableCOMDATFolding>true</EnableCOMDATFolding> |
| | | <OptimizeReferences>true</OptimizeReferences> |
| | | <AdditionalLibraryDirectories>.\DLL\32bit;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> |
| | | <AdditionalDependencies>SGIFPJ.lib;%(AdditionalDependencies)</AdditionalDependencies> |
| | | </Link> |
| | | <Midl> |
| | | <MkTypLibCompatible>false</MkTypLibCompatible> |
| | | <ValidateAllParameters>true</ValidateAllParameters> |
| | | <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | </Midl> |
| | | <ResourceCompile> |
| | | <Culture>0x0804</Culture> |
| | | <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ResourceCompile> |
| | | </ItemDefinitionGroup> |
| | | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
| | | <ClCompile> |
| | | <PrecompiledHeader>Use</PrecompiledHeader> |
| | | <WarningLevel>Level3</WarningLevel> |
| | | <FunctionLevelLinking>true</FunctionLevelLinking> |
| | | <IntrinsicFunctions>true</IntrinsicFunctions> |
| | | <SDLCheck>true</SDLCheck> |
| | | <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> |
| | | <AdditionalIncludeDirectories>.;..;.\DLL\64bit;.\CCLinkPerformance;..\MELSECSDK\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | <Optimization>MaxSpeed</Optimization> |
| | | </ClCompile> |
| | | <Link> |
| | | <SubSystem>Windows</SubSystem> |
| | | <EnableCOMDATFolding>true</EnableCOMDATFolding> |
| | | <OptimizeReferences>true</OptimizeReferences> |
| | | <AdditionalLibraryDirectories>.\DLL\64bit;..\MELSECSDK\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> |
| | | <AdditionalDependencies>SGIFPJ.lib;MdFunc32.lib;%(AdditionalDependencies)</AdditionalDependencies> |
| | | </Link> |
| | | <Midl> |
| | | <MkTypLibCompatible>false</MkTypLibCompatible> |
| | | <ValidateAllParameters>true</ValidateAllParameters> |
| | | <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | </Midl> |
| | | <ResourceCompile> |
| | | <Culture>0x0804</Culture> |
| | | <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ResourceCompile> |
| | | <PostBuildEvent> |
| | | <Command>if exist "\\DESKTOP-IODBVIQ\SGMeasurement\" ( |
| | | xcopy /Y /D "$(OutDir)SGIFPJ.dll" "\\DESKTOP-IODBVIQ\SGMeasurement\" |
| | | xcopy /Y /D "$(OutDir)$(ProjectName).exe" "\\DESKTOP-IODBVIQ\SGMeasurement\" |
| | | xcopy /Y /D "$(OutDir)$(ProjectName).pdb" "\\DESKTOP-IODBVIQ\SGMeasurement\" |
| | | )</Command> |
| | | </PostBuildEvent> |
| | | </ItemDefinitionGroup> |
| | | <ItemGroup> |
| | | <ClInclude Include="CCLinkPerformance\CCLinkIEControl.h" /> |
| | | <ClInclude Include="CCLinkPerformance\PerformanceMelsec.h" /> |
| | | <ClInclude Include="framework.h" /> |
| | | <ClInclude Include="Logger.h" /> |
| | | <ClInclude Include="pch.h" /> |
| | | <ClInclude Include="PLCSignalListener.h" /> |
| | | <ClInclude Include="Resource.h" /> |
| | | <ClInclude Include="SGMeasurement.h" /> |
| | | <ClInclude Include="SGMeasurementDlg.h" /> |
| | | <ClInclude Include="targetver.h" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClCompile Include="CCLinkPerformance\CCLinkIEControl.cpp" /> |
| | | <ClCompile Include="CCLinkPerformance\PerformanceMelsec.cpp" /> |
| | | <ClCompile Include="Logger.cpp" /> |
| | | <ClCompile Include="pch.cpp"> |
| | | <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> |
| | | <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> |
| | | <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> |
| | | <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> |
| | | </ClCompile> |
| | | <ClCompile Include="PLCSignalListener.cpp" /> |
| | | <ClCompile Include="SGMeasurement.cpp" /> |
| | | <ClCompile Include="SGMeasurementDlg.cpp" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ResourceCompile Include="SGMeasurement.rc" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <None Include="res\SGMeasurement.rc2" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <Image Include="res\menu_close.ico" /> |
| | | <Image Include="res\menu_restore.ico" /> |
| | | <Image Include="res\SGMeasurement.ico" /> |
| | | </ItemGroup> |
| | | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |
| | | <ImportGroup Label="ExtensionTargets"> |
| | | </ImportGroup> |
| | | </Project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
| | | <ItemGroup> |
| | | <Filter Include="æºæä»¶"> |
| | | <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> |
| | | <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions> |
| | | </Filter> |
| | | <Filter Include="头æä»¶"> |
| | | <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> |
| | | <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions> |
| | | </Filter> |
| | | <Filter Include="èµæºæä»¶"> |
| | | <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> |
| | | <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> |
| | | </Filter> |
| | | <Filter Include="CCLinkPerformance"> |
| | | <UniqueIdentifier>{5874a2ba-95ca-44c8-a816-3e468f17564e}</UniqueIdentifier> |
| | | </Filter> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClInclude Include="SGMeasurement.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="SGMeasurementDlg.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="framework.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="targetver.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="Resource.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="pch.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="Logger.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="CCLinkPerformance\CCLinkIEControl.h"> |
| | | <Filter>CCLinkPerformance</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="CCLinkPerformance\PerformanceMelsec.h"> |
| | | <Filter>CCLinkPerformance</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="PLCSignalListener.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClCompile Include="SGMeasurement.cpp"> |
| | | <Filter>æºæä»¶</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="SGMeasurementDlg.cpp"> |
| | | <Filter>æºæä»¶</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="pch.cpp"> |
| | | <Filter>æºæä»¶</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="Logger.cpp"> |
| | | <Filter>æºæä»¶</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="CCLinkPerformance\CCLinkIEControl.cpp"> |
| | | <Filter>CCLinkPerformance</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="CCLinkPerformance\PerformanceMelsec.cpp"> |
| | | <Filter>CCLinkPerformance</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="PLCSignalListener.cpp"> |
| | | <Filter>æºæä»¶</Filter> |
| | | </ClCompile> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ResourceCompile Include="SGMeasurement.rc"> |
| | | <Filter>èµæºæä»¶</Filter> |
| | | </ResourceCompile> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <None Include="res\SGMeasurement.rc2"> |
| | | <Filter>èµæºæä»¶</Filter> |
| | | </None> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <Image Include="res\SGMeasurement.ico"> |
| | | <Filter>èµæºæä»¶</Filter> |
| | | </Image> |
| | | <Image Include="res\menu_restore.ico"> |
| | | <Filter>èµæºæä»¶</Filter> |
| | | </Image> |
| | | <Image Include="res\menu_close.ico"> |
| | | <Filter>èµæºæä»¶</Filter> |
| | | </Image> |
| | | </ItemGroup> |
| | | </Project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
| | | <PropertyGroup> |
| | | <RESOURCE_FILE>SGMeasurement.rc</RESOURCE_FILE> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
| | | <DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
| | | <RemoteDebuggerCommand>\\DESKTOP-IODBVIQ\SGMeasurement\$(ProjectName).exe</RemoteDebuggerCommand> |
| | | <RemoteDebuggerWorkingDirectory>\\DESKTOP-IODBVIQ\SGMeasurement</RemoteDebuggerWorkingDirectory> |
| | | <RemoteDebuggerServerName>DESKTOP-IODBVIQ</RemoteDebuggerServerName> |
| | | <DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor> |
| | | </PropertyGroup> |
| | | </Project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | |  |
| | | // SGMeasurementDlg.cpp: å®ç°æä»¶ |
| | | // |
| | | |
| | | #include "pch.h" |
| | | #include "framework.h" |
| | | #include "SGMeasurement.h" |
| | | #include "SGMeasurementDlg.h" |
| | | #include "afxdialogex.h" |
| | | #include "SGIF.h" |
| | | #include "Logger.h" |
| | | |
| | | #ifdef _DEBUG |
| | | #define new DEBUG_NEW |
| | | #endif |
| | | |
| | | #define DeviceID 0 |
| | | |
| | | // æç徿 ID 䏿¶æ¯å® |
| | | #define ID_TRAY_RESTORE 2001 // æ¢å¤çªå£ |
| | | #define ID_TRAY_EXIT 2002 // éåºç¨åº |
| | | #define WM_TRAY_ICON_NOTIFY (WM_USER + 1000) // æç徿 åè°æ¶æ¯ ID |
| | | |
| | | // æçæç¤ºææ¬å® |
| | | #define TRAY_ICON_TOOLTIP_TEXT _T("SGMeasurement") |
| | | |
| | | // æ¥å¿é¢è²å®å®ä¹ |
| | | #define LOG_COLOR_NORMAL RGB(0, 0, 0) // æ®éï¼é»è² |
| | | #define LOG_COLOR_SUCCESS RGB(0, 128, 0) // æåï¼ç»¿è² |
| | | #define LOG_COLOR_ERROR RGB(255, 0, 0) // é误ï¼çº¢è² |
| | | #define LOG_COLOR_WARNING RGB(255, 165, 0) // è¦åï¼æ©è² |
| | | #define LOG_COLOR_TIME RGB(0, 0, 255) // æ¶é´æ³ï¼èè² |
| | | |
| | | // 宿¶å¨ç¸å
³å®å®ä¹ |
| | | #define TIMER_INTERVAL_MS 500 |
| | | #define TIMER_ID_OUTPUT_UPDATE 1 |
| | | |
| | | // 计æ¶å®å®ä¹ |
| | | #define MEASURE_FUNC_START() \ |
| | | clock_t __startClock = clock(); |
| | | |
| | | #define MEASURE_FUNC_END() \ |
| | | do { \ |
| | | clock_t __endClock = clock(); \ |
| | | double __elapsedMs = 1000.0 * (__endClock - __startClock) / CLOCKS_PER_SEC; \ |
| | | CString __strElapsed; \ |
| | | __strElapsed.Format(_T("%s æ§è¡èæ¶ï¼%.1f ms"), _T(__FUNCTION__), __elapsedMs); \ |
| | | AppendLogLineRichStyled(__strElapsed, LOG_COLOR_SUCCESS); \ |
| | | } while (0) |
| | | |
| | | class CAboutDlg : public CDialogEx |
| | | { |
| | | public: |
| | | CAboutDlg(); |
| | | |
| | | // å¯¹è¯æ¡æ°æ® |
| | | #ifdef AFX_DESIGN_TIME |
| | | enum { IDD = IDD_ABOUTBOX }; |
| | | #endif |
| | | |
| | | protected: |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ |
| | | |
| | | // å®ç° |
| | | protected: |
| | | DECLARE_MESSAGE_MAP() |
| | | }; |
| | | |
| | | CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) |
| | | { |
| | | } |
| | | |
| | | void CAboutDlg::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | } |
| | | |
| | | BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) |
| | | END_MESSAGE_MAP() |
| | | |
| | | CSGMeasurementDlg::CSGMeasurementDlg(CWnd* pParent /*=nullptr*/) |
| | | : CDialogEx(IDD_SGMEASUREMENT_DIALOG, pParent) |
| | | , m_bConnected(false) |
| | | , m_bSaving(false) |
| | | , m_dOutValues{ 0.0, 0.0, 0.0, 0.0 } |
| | | , m_nUseTrigger(0) |
| | | , m_nSavePointCount(100000) |
| | | , m_fJumpThreshold(0.2f) |
| | | , m_nJumpWindow(3) |
| | | , m_nValleyMargin(0) |
| | | , m_nMinGlass1Count(10) |
| | | , m_nFixedCount(5) |
| | | , m_fMaxDelta(0.05f) |
| | | , m_nTrayIconID(0) |
| | | , m_bTrayIconCreated(FALSE) |
| | | , m_bExitingFromTray(FALSE) |
| | | { |
| | | m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | DDX_Text(pDX, IDC_EDIT_OUT1, m_dOutValues[0]); |
| | | DDX_Text(pDX, IDC_EDIT_OUT2, m_dOutValues[1]); |
| | | DDX_Text(pDX, IDC_EDIT_OUT3, m_dOutValues[2]); |
| | | DDX_Text(pDX, IDC_EDIT_OUT4, m_dOutValues[3]); |
| | | DDX_Control(pDX, IDC_RICHEDIT_LOG, m_editLog); |
| | | DDX_Check(pDX, IDC_CHECK_USE_TRIGGER, m_nUseTrigger); |
| | | DDX_Control(pDX, IDC_COMBO_OUTPUT_PORT, m_comboOutputPort); |
| | | DDX_Text(pDX, IDC_EDIT_STORE_COUNT, m_nSavePointCount); |
| | | DDX_Text(pDX, IDC_EDIT_JUMP_WINDOW, m_nJumpWindow); |
| | | DDX_Text(pDX, IDC_EDIT_VALLEY_MARGIN, m_nValleyMargin); |
| | | DDX_Text(pDX, IDC_EDIT_MIN_GLASS_COUNT, m_nMinGlass1Count); |
| | | DDX_Text(pDX, IDC_EDIT_FIXED_COUNT, m_nFixedCount); |
| | | DDX_Text(pDX, IDC_EDIT_JUMP_THRESHOLD, m_fJumpThreshold); |
| | | DDX_Text(pDX, IDC_EDIT_MAX_DELTA, m_fMaxDelta); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::ExitApplication() |
| | | { |
| | | // æå¼è®¾å¤è¿æ¥ï¼å¦å·²è¿æ¥ï¼ |
| | | if (m_bConnected) { |
| | | DisconnectFromDevice(); |
| | | } |
| | | |
| | | // å 餿ç徿 ï¼å¦å·²æ·»å ï¼ |
| | | if (m_bTrayIconCreated) { |
| | | Shell_NotifyIcon(NIM_DELETE, &m_trayIconData); |
| | | m_bTrayIconCreated = FALSE; |
| | | } |
| | | |
| | | m_plcListener.Stop(); |
| | | |
| | | DestroyWindow(); |
| | | CDialogEx::OnClose(); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::UpdateControlStatus(BOOL bConnected, BOOL bStoring/* = FALSE*/) |
| | | { |
| | | // è¿æ¥æé®åæå¼æé®ç¶æäºæ¥ |
| | | GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(!bConnected); |
| | | GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(bConnected); |
| | | |
| | | // IPå°åè¾å
¥åªå
è®¸å¨æªè¿æ¥æ¶ä¿®æ¹ |
| | | GetDlgItem(IDC_IPADDRESS)->EnableWindow(!bConnected); |
| | | |
| | | // åå¨é
ç½®æ§ä»¶ä»
å¨å·²è¿æ¥ä¸æªå¼å§å卿¶å
许æä½ |
| | | BOOL bCanConfigure = bConnected && !bStoring; |
| | | /*GetDlgItem(IDC_CHECK_USE_TRIGGER)->EnableWindow(bCanConfigure);*/ |
| | | GetDlgItem(IDC_COMBO_OUTPUT_PORT)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_EDIT_STORE_COUNT)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_EDIT_JUMP_THRESHOLD)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_EDIT_JUMP_WINDOW)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_EDIT_VALLEY_MARGIN)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_EDIT_MIN_GLASS_COUNT)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_EDIT_FIXED_COUNT)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_EDIT_MAX_DELTA)->EnableWindow(bCanConfigure); |
| | | |
| | | // åå¨ç¸å
³æé® |
| | | GetDlgItem(IDC_BUTTON_RECEIVE_FROM_CTRL)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_BUTTON_SEND_TO_CTRL)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_BUTTON_CLEAR_STORE)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_BUTTON_START_STORE)->EnableWindow(bCanConfigure); |
| | | GetDlgItem(IDC_BUTTON_STOP_STORE)->EnableWindow(bStoring); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::AppendLogLineBatchBegin() |
| | | { |
| | | m_editLog.SetRedraw(FALSE); |
| | | m_editLog.SetEventMask(0); // 鲿¢è§¦åä¸å¿
è¦çéç¥ |
| | | } |
| | | |
| | | void CSGMeasurementDlg::AppendLogLineBatchEnd() |
| | | { |
| | | m_editLog.SetRedraw(TRUE); |
| | | m_editLog.Invalidate(); // 强å¶éç» |
| | | m_editLog.SetEventMask(ENM_CHANGE | ENM_SELCHANGE); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::TrimRichEditLineLimit(int nMaxLines) |
| | | { |
| | | int nLineCount = m_editLog.GetLineCount(); |
| | | if (nLineCount < nMaxLines) { |
| | | return; |
| | | } |
| | | |
| | | // è·åå¤ä½è¡çå符æ°èå´ |
| | | int charIndex = m_editLog.LineIndex(nMaxLines); |
| | | m_editLog.SetSel(0, charIndex); // éä¸å¤ä½å
容 |
| | | m_editLog.ReplaceSel(_T("")); // å é¤ |
| | | } |
| | | |
| | | void CSGMeasurementDlg::AppendLogLineRichStyled(const CString& strContent, COLORREF color /*= RGB(0, 0, 0)*/) |
| | | { |
| | | if (!::IsWindow(GetSafeHwnd()) || !::IsWindow(m_editLog.GetSafeHwnd())) { |
| | | return; |
| | | } |
| | | |
| | | // æ¶é´æ³ |
| | | CString strTimestamp; |
| | | CTime now = CTime::GetCurrentTime(); |
| | | strTimestamp.Format(_T("[%02d:%02d:%02d] "), now.GetHour(), now.GetMinute(), now.GetSecond()); |
| | | |
| | | // æå
¥ç¹ç§»å°æåï¼ä¹å¯ä»¥è®¾ä¸º 0 表示顶é¨ï¼ |
| | | m_editLog.SetSel(-1, -1); |
| | | |
| | | // æå
¥æ¶é´ï¼èè²ï¼ |
| | | CHARFORMAT2 cfTime = {}; |
| | | cfTime.cbSize = sizeof(cfTime); |
| | | cfTime.dwMask = CFM_COLOR; |
| | | cfTime.crTextColor = LOG_COLOR_TIME; |
| | | m_editLog.SetSelectionCharFormat(cfTime); |
| | | m_editLog.ReplaceSel(strTimestamp); |
| | | |
| | | // çææ¥å¿çº§å«æ ç¾ |
| | | CString strLevel; |
| | | if (color == LOG_COLOR_WARNING) { |
| | | strLevel = _T("[è¦å]"); |
| | | } |
| | | else if (color == LOG_COLOR_ERROR) { |
| | | strLevel = _T("[é误]"); |
| | | } |
| | | else if (color == LOG_COLOR_NORMAL) { |
| | | strLevel = _T("[ä¿¡æ¯]"); |
| | | } |
| | | else if (color == LOG_COLOR_SUCCESS) { |
| | | strLevel = _T("[æå]"); |
| | | } |
| | | else { |
| | | strLevel = _T("[æªç¥]"); |
| | | } |
| | | |
| | | // æå
¥æ¥å¿æ£æï¼ä¼ å
¥é¢è²ï¼ |
| | | CHARFORMAT2 cfMsg = {}; |
| | | cfMsg.cbSize = sizeof(cfMsg); |
| | | cfMsg.dwMask = CFM_COLOR; |
| | | cfMsg.crTextColor = color; |
| | | m_editLog.SetSelectionCharFormat(cfMsg); |
| | | m_editLog.ReplaceSel(strLevel + strContent + _T("\r\n")); |
| | | |
| | | // éå¶æå¤§è¡æ° |
| | | TrimRichEditLineLimit(100); |
| | | |
| | | // æ¼æ¥å®æ´æ¥å¿è¡ |
| | | CString strFullLogLine; |
| | | strFullLogLine.Format(_T("%s %s"), strLevel, strContent); |
| | | |
| | | // åå
¥æ¥å¿æä»¶ |
| | | // LOG_LINE(strFullLogLine); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::HighlightAllMatches(const CString& strSearch, COLORREF clrHighlight/* = RGB(255, 165, 0)*/) |
| | | { |
| | | if (strSearch.IsEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | long nStart = 0; |
| | | long nEnd = m_editLog.GetTextLength(); |
| | | FINDTEXTEX ft = { 0 }; |
| | | ft.chrg.cpMin = 0; |
| | | ft.chrg.cpMax = nEnd; |
| | | ft.lpstrText = strSearch.GetString(); |
| | | |
| | | // é«äº®å䏿¸
é¤å
¨æé¢è²ï¼é¿å
åå²å¤è²æ··æ· |
| | | while (m_editLog.FindText(FR_DOWN, &ft) != -1) { |
| | | m_editLog.SetSel(ft.chrgText.cpMin, ft.chrgText.cpMax); |
| | | |
| | | CHARFORMAT2 cf = {}; |
| | | cf.cbSize = sizeof(cf); |
| | | cf.dwMask = CFM_COLOR; |
| | | cf.crTextColor = clrHighlight; |
| | | m_editLog.SetSelectionCharFormat(cf); |
| | | |
| | | // 䏿¬¡æç´¢ä»åé¢å¼å§ |
| | | ft.chrg.cpMin = ft.chrgText.cpMax; |
| | | } |
| | | m_editLog.SetSel(-1, 0); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::PrintSampleData(int nOutNo, const std::vector<float>& vecBuffer) |
| | | { |
| | | int nReceived = static_cast<int>(vecBuffer.size()); |
| | | if (vecBuffer.empty() || nReceived < 0) { |
| | | CString strError; |
| | | strError.Format(_T("OUT%d: æ¥æ¶æ°æ®ä¸ºç©ºææ æï¼æ æ³æå°ã"), nOutNo); |
| | | AppendLogLineRichStyled(strError, LOG_COLOR_WARNING); |
| | | return; |
| | | } |
| | | |
| | | CString strLine; |
| | | for (int i = 0; i < nReceived; ++i) { |
| | | CString strOne; |
| | | strOne.Format(_T("%10.3f "), vecBuffer[i]); |
| | | strLine += strOne; |
| | | |
| | | // æ¯ 7 个å¼è¾åºä¸è¡ |
| | | if ((i + 1) % 7 == 0 || i == nReceived - 1) { |
| | | AppendLogLineRichStyled(strLine, LOG_COLOR_NORMAL); |
| | | strLine.Empty(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::ConnectToDevice() |
| | | { |
| | | if (m_bConnected) { |
| | | AppendLogLineRichStyled(_T("设å¤å·²è¿æ¥ï¼è¯·å
æå¼è¿æ¥ã"), LOG_COLOR_WARNING); |
| | | return false; |
| | | } |
| | | |
| | | SGIF_OPENPARAM_ETHERNET stIpAddress = { 0 }; |
| | | |
| | | CIPAddressCtrl* pIPCtrl = (CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS); |
| | | if (!::IsWindow(pIPCtrl->GetSafeHwnd())) { |
| | | AppendLogLineRichStyled(_T("IP æ§ä»¶æ æï¼è¿æ¥å¤±è´¥ï¼"), LOG_COLOR_ERROR); |
| | | return false; |
| | | } |
| | | |
| | | pIPCtrl->GetAddress( |
| | | stIpAddress.IPAddress.S_un.S_un_b.s_b1, |
| | | stIpAddress.IPAddress.S_un.S_un_b.s_b2, |
| | | stIpAddress.IPAddress.S_un.S_un_b.s_b3, |
| | | stIpAddress.IPAddress.S_un.S_un_b.s_b4 |
| | | ); |
| | | |
| | | RC nRet = SGIF_OpenDeviceETHER(DeviceID, &stIpAddress); |
| | | if (nRet == RC_OK) { |
| | | AppendLogLineRichStyled(_T("æå¼è¿æ¥æåï¼"), LOG_COLOR_SUCCESS); |
| | | |
| | | m_bConnected = TRUE; |
| | | UpdateControlStatus(TRUE, FALSE); |
| | | SetTimer(TIMER_ID_OUTPUT_UPDATE, TIMER_INTERVAL_MS, nullptr); |
| | | return true; |
| | | } |
| | | else { |
| | | CString strError; |
| | | strError.Format(_T("æå¼è¿æ¥å¤±è´¥ï¼é误ç ï¼%#X"), nRet); |
| | | AppendLogLineRichStyled(strError, LOG_COLOR_ERROR); |
| | | |
| | | m_bConnected = FALSE; |
| | | UpdateControlStatus(FALSE, FALSE); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::DisconnectFromDevice() |
| | | { |
| | | if (!m_bConnected) { |
| | | AppendLogLineRichStyled(_T("è®¾å¤æªè¿æ¥ï¼æ éæå¼ã"), LOG_COLOR_WARNING); |
| | | return false; |
| | | } |
| | | |
| | | // 忢宿¶å¨ï¼é¿å
卿å¼åä»å°è¯æ´æ°è¾åºæ°æ® |
| | | KillTimer(TIMER_ID_OUTPUT_UPDATE); |
| | | |
| | | // å
åæ¢æ°æ®åå¨ï¼å¦ææ£å¨è¿è¡ï¼ |
| | | RC nRet; |
| | | if (m_bConnected && m_bSaving) { |
| | | nRet = SGIF_DataStorageStop(DeviceID); |
| | | if (nRet == RC_OK) { |
| | | m_bSaving = FALSE; |
| | | AppendLogLineRichStyled(_T("æ°æ®åå¨å·²åæ¢ã"), LOG_COLOR_SUCCESS); |
| | | } |
| | | else { |
| | | CString strError; |
| | | strError.Format(_T("åæ¢æ°æ®åå¨å¤±è´¥ï¼é误ç ï¼%#X"), nRet); |
| | | AppendLogLineRichStyled(strError, LOG_COLOR_ERROR); |
| | | } |
| | | } |
| | | |
| | | // æå¼è®¾å¤è¿æ¥ |
| | | nRet = SGIF_CloseDevice(DeviceID); |
| | | if (nRet == RC_OK) { |
| | | AppendLogLineRichStyled(_T("æå¼è¿æ¥æåï¼"), LOG_COLOR_SUCCESS); |
| | | |
| | | m_bConnected = FALSE; |
| | | UpdateControlStatus(FALSE, FALSE); |
| | | return true; |
| | | } |
| | | else { |
| | | CString strError; |
| | | strError.Format(_T("æå¼è¿æ¥å¤±è´¥ï¼é误ç ï¼%#X"), nRet); |
| | | AppendLogLineRichStyled(strError, LOG_COLOR_ERROR); |
| | | AppendLogLineRichStyled(_T("ä¿æå½åç¶æï¼æå¼å¤±è´¥ã"), LOG_COLOR_ERROR); |
| | | |
| | | UpdateControlStatus(m_bConnected, m_bSaving); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | void CSGMeasurementDlg::CleanInvalidValuesInPlace(int nOutNo, std::vector<float>& vecData, float fInvalid/* = -999.0f*/) |
| | | { |
| | | MEASURE_FUNC_START(); |
| | | |
| | | // æ¾å°ç¬¬ä¸ä¸ªææå¼ |
| | | auto itStart = std::find_if(vecData.begin(), vecData.end(), [=](float v) { return v > fInvalid; }); |
| | | |
| | | // æ¾å°æåä¸ä¸ªææå¼ |
| | | auto itEnd = std::find_if(vecData.rbegin(), vecData.rend(), [=](float v) { return v > fInvalid; }).base(); |
| | | |
| | | // æ£æ¥æ¯å¦ææææ°æ® |
| | | if (itStart < itEnd) { |
| | | // å
è£è¾¹ |
| | | std::vector<float> vecTrimmed(itStart, itEnd); |
| | | |
| | | // åç§»é¤ä¸é´çæ æå¼ |
| | | auto itNewEnd = std::remove_if(vecTrimmed.begin(), vecTrimmed.end(), [=](float v) { return v == fInvalid; }); |
| | | vecTrimmed.erase(itNewEnd, vecTrimmed.end()); |
| | | |
| | | vecData = std::move(vecTrimmed); |
| | | |
| | | CString strLog; |
| | | strLog.Format(_T("OUT%d: å·²è£åªæ æè¾¹çæ°æ®ï¼å©ä½æææ°æ® %d 个ã"), nOutNo, static_cast<int>(vecData.size())); |
| | | AppendLogLineRichStyled(strLog, LOG_COLOR_NORMAL); |
| | | |
| | | if (vecData.size() < 20) { |
| | | AppendLogLineRichStyled(_T("è¦åï¼æææ°æ®éè¿å°ï¼å¯è½å½±ååç»å¤çã"), LOG_COLOR_WARNING); |
| | | } |
| | | else { |
| | | CString strInfo; |
| | | strInfo.Format(_T("OUT%d: æææ°æ®èå´ [%f, %f]"), nOutNo, *std::min_element(vecData.begin(), vecData.end()), *std::max_element(vecData.begin(), vecData.end())); |
| | | AppendLogLineRichStyled(strInfo, LOG_COLOR_NORMAL); |
| | | } |
| | | |
| | | PrintSampleData(nOutNo, vecData); |
| | | } |
| | | else { |
| | | vecData.clear(); |
| | | } |
| | | |
| | | MEASURE_FUNC_END(); |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::SplitGlassSegments(int nOutNo, const std::vector<float>& vecData, std::vector<float>& vecGlass1, std::vector<float>& vecGlass2, float fJumpThreshold /*= 0.2f*/, int nWindow /*= 3*/, int nValleyMargin /*= 0*/, int nMinGlassCount /*= 10*/) |
| | | { |
| | | MEASURE_FUNC_START(); |
| | | |
| | | CString strLog; |
| | | const int nTotal = static_cast<int>(vecData.size()); |
| | | |
| | | if (nTotal < 2 * nWindow + 1 + nMinGlassCount) { |
| | | strLog.Format(_T("OUT%d: æ°æ®éä¸è¶³ï¼è³å°éè¦ %d ä¸ªç¹æè½åå²ã"), nOutNo, 2 * nWindow + 1 + nMinGlassCount); |
| | | AppendLogLineRichStyled(strLog, LOG_COLOR_WARNING); |
| | | return false; |
| | | } |
| | | |
| | | // ä»ä¸é´åä¸¤è¾¹æ¥æ¾ valley åéç¹ |
| | | int nMid = nTotal / 2; |
| | | int nValleyLeft = -1, nValleyRight = -1; |
| | | |
| | | // åå·¦æ¥æ¾ valley |
| | | for (int i = nMid; i >= nWindow; --i) { |
| | | float fDelta = std::fabs(vecData[i] - vecData[i - nWindow]); |
| | | if (fDelta > fJumpThreshold && |
| | | vecData[i] < vecData[i - 1] && |
| | | vecData[i] < vecData[i + 1]) { |
| | | nValleyLeft = i; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // å峿¥æ¾ valley |
| | | for (int i = nMid; i <= nTotal - nWindow - 2; ++i) { |
| | | float fDelta = std::fabs(vecData[i + nWindow] - vecData[i]); |
| | | if (fDelta > fJumpThreshold && |
| | | vecData[i] < vecData[i - 1] && |
| | | vecData[i] < vecData[i + 1]) { |
| | | nValleyRight = i; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // éå® valley ç¹ |
| | | int nValleyIdx = -1; |
| | | if (nValleyLeft > 0 && nValleyRight > 0) { |
| | | nValleyIdx = (vecData[nValleyLeft] < vecData[nValleyRight]) ? nValleyLeft : nValleyRight; |
| | | } |
| | | else if (nValleyLeft > 0) { |
| | | nValleyIdx = nValleyLeft; |
| | | } |
| | | else if (nValleyRight > 0) { |
| | | nValleyIdx = nValleyRight; |
| | | } |
| | | |
| | | // fallback: valley æªæ¾å°ï¼ä½¿ç¨ä¸é´å岿³ |
| | | if (nValleyIdx < 0) { |
| | | AppendLogLineRichStyled(_T("æªæ¾å° valley è·³åç¹ï¼ä½¿ç¨ä¸é´ä½ç½®åå²ã"), LOG_COLOR_WARNING); |
| | | nValleyIdx = nMid; |
| | | } |
| | | |
| | | // åºç¨åå²ä½ç½®ï¼éå¶è¾¹ç |
| | | int nCutPos = max(1, min(nTotal - 1, nValleyIdx + nValleyMargin)); |
| | | |
| | | vecGlass1.assign(vecData.begin(), vecData.begin() + nCutPos); |
| | | vecGlass2.assign(vecData.begin() + nCutPos, vecData.end()); |
| | | |
| | | int nGlass1Count = static_cast<int>(vecGlass1.size()); |
| | | int nGlass2Count = static_cast<int>(vecGlass2.size()); |
| | | |
| | | // æ¥å¿è¾åº |
| | | strLog.Format(_T("OUT%d: å岿åï¼ç¬¬ä¸çç»ç %d ç¹ï¼ç¬¬äºçç»ç %d ç¹ã"), nOutNo, nGlass1Count, nGlass2Count); |
| | | AppendLogLineRichStyled(strLog, LOG_COLOR_SUCCESS); |
| | | |
| | | if (nGlass1Count < nMinGlassCount) { |
| | | strLog.Format(_T("OUT%d: 第ä¸çç»çæ°æ®éå°äº %d ç¹ï¼å¯è½å½±å计ç®ã"), nOutNo, nMinGlassCount); |
| | | AppendLogLineRichStyled(strLog, LOG_COLOR_WARNING); |
| | | } |
| | | |
| | | if (nGlass2Count < nMinGlassCount) { |
| | | strLog.Format(_T("OUT%d: 第äºçç»çæ°æ®éå°äº %d ç¹ï¼å¯è½å½±å计ç®ã"), nOutNo, nMinGlassCount); |
| | | AppendLogLineRichStyled(strLog, LOG_COLOR_WARNING); |
| | | } |
| | | |
| | | AppendLogLineRichStyled(_T("第ä¸çç»çæ°æ®ï¼"), LOG_COLOR_NORMAL); |
| | | PrintSampleData(nOutNo, vecGlass1); |
| | | |
| | | AppendLogLineRichStyled(_T("第äºçç»çæ°æ®ï¼"), LOG_COLOR_NORMAL); |
| | | PrintSampleData(nOutNo, vecGlass2); |
| | | |
| | | MEASURE_FUNC_END(); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::FilterDominantGroup(int nOutNo, const std::vector<float>& vecInput, std::vector<float>& vecOutput) |
| | | { |
| | | MEASURE_FUNC_START(); |
| | | |
| | | if (vecInput.empty()) { |
| | | AppendLogLineRichStyled(_T("è¾å
¥æ°æ®ä¸ºç©ºï¼æ æ³è¿è¡åç»çéã"), LOG_COLOR_WARNING); |
| | | return false; |
| | | } |
| | | |
| | | // åç»ï¼map<intæ´æ°é¨å, vector<float>> |
| | | std::map<int, std::vector<float>> mapGroup; |
| | | for (float fVal : vecInput) { |
| | | int nKey = static_cast<int>(fVal); |
| | | mapGroup[nKey].push_back(fVal); |
| | | } |
| | | |
| | | // æ¾åºæ°éæå¤çé£ç» |
| | | size_t nMaxCount = 0; |
| | | auto itMaxGroup = mapGroup.begin(); |
| | | for (auto it = mapGroup.begin(); it != mapGroup.end(); ++it) { |
| | | if (it->second.size() > nMaxCount) { |
| | | nMaxCount = it->second.size(); |
| | | itMaxGroup = it; |
| | | } |
| | | } |
| | | |
| | | if (nMaxCount == 0) { |
| | | AppendLogLineRichStyled(_T("æææ°æ®é½è¢«è¿æ»¤æä¸ºç©ºï¼æ æ³çéåºä¸»è¦åç»ã"), LOG_COLOR_WARNING); |
| | | return false; |
| | | } |
| | | |
| | | vecOutput = itMaxGroup->second; |
| | | |
| | | CString strLog; |
| | | strLog.Format(_T("æåä» %d 个ç»ä¸çéåºä¸»è¦åç»ï¼å¼çº¦ä¸º %dï¼å
± %zu 个ç¹ã"), static_cast<int>(mapGroup.size()), itMaxGroup->first, nMaxCount); |
| | | AppendLogLineRichStyled(strLog, LOG_COLOR_SUCCESS); |
| | | |
| | | // æå°çéåçæ°æ® |
| | | AppendLogLineRichStyled(_T("çéåç主è¦åç»æ°æ®ï¼"), LOG_COLOR_NORMAL); |
| | | PrintSampleData(nOutNo, vecOutput); |
| | | |
| | | MEASURE_FUNC_END(); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::ExtractStableRegionFixed(int nOutNo, const std::vector<float>& vecIn, std::vector<float>& vecOut, int nFixedCount/* = 5*/, float fMaxDelta/* = 0.04f*/) |
| | | { |
| | | MEASURE_FUNC_START(); |
| | | |
| | | const int n = static_cast<int>(vecIn.size()); |
| | | if (n < nFixedCount) { |
| | | CString strError; |
| | | strError.Format(_T("OUT%d: æ°æ®éä¸è¶³ï¼è³å°éè¦ %d ä¸ªç¹æè½æå稳å®åºã"), nOutNo, nFixedCount); |
| | | return false; |
| | | } |
| | | |
| | | int nBestStart = -1; |
| | | float fBestRange = FLT_MAX; |
| | | |
| | | for (int i = 0; i <= n - nFixedCount; ++i) { |
| | | auto first = vecIn.begin() + i; |
| | | auto last = first + nFixedCount; |
| | | |
| | | float fMinVal = *std::min_element(first, last); |
| | | float fMaxVal = *std::max_element(first, last); |
| | | float fRange = fMaxVal - fMinVal; |
| | | |
| | | if (fRange <= fMaxDelta && fRange < fBestRange) { |
| | | fBestRange = fRange; |
| | | nBestStart = i; |
| | | } |
| | | } |
| | | |
| | | if (nBestStart < 0) { |
| | | return false; |
| | | } |
| | | |
| | | vecOut.assign(vecIn.begin() + nBestStart, vecIn.begin() + nBestStart + nFixedCount); |
| | | |
| | | CString strLog; |
| | | strLog.Format(_T("OUT%d: æå稳å®åºæåï¼èµ·å§ç¹ç´¢å¼ %dï¼èå´ %.3fã"), nOutNo, nBestStart, fBestRange); |
| | | AppendLogLineRichStyled(strLog, LOG_COLOR_SUCCESS); |
| | | |
| | | if (vecOut.size() < nFixedCount) { |
| | | CString strWarning; |
| | | strWarning.Format(_T("OUT%d: æåç稳å®åºæ°æ®éä¸è¶³ï¼å¯è½å½±ååç»å¤çã"), nOutNo); |
| | | AppendLogLineRichStyled(strWarning, LOG_COLOR_WARNING); |
| | | } |
| | | |
| | | // æå°æåç稳å®åºæ°æ® |
| | | AppendLogLineRichStyled(_T("æåç稳å®åºæ°æ®ï¼"), LOG_COLOR_NORMAL); |
| | | PrintSampleData(nOutNo, vecOut); |
| | | |
| | | MEASURE_FUNC_END(); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::CalcGlassOffset(const std::vector<float>& vecGlass1, const std::vector<float>& vecGlass2, float& fAvg1, float& fAvg2, float& fOffset) |
| | | { |
| | | MEASURE_FUNC_START(); |
| | | |
| | | if (vecGlass1.empty() || vecGlass2.empty()) { |
| | | AppendLogLineRichStyled(_T("稳å®åºæ°æ®ä¸ºç©ºï¼æ æ³è®¡ç®å¹³åå¼ååç§»ã"), LOG_COLOR_WARNING); |
| | | return false; |
| | | } |
| | | |
| | | auto CalcAverage = [](const std::vector<float>& data) -> float { |
| | | float sum = std::accumulate(data.begin(), data.end(), 0.0f); |
| | | return sum / static_cast<float>(data.size()); |
| | | }; |
| | | |
| | | fAvg1 = CalcAverage(vecGlass1); |
| | | fAvg2 = CalcAverage(vecGlass2); |
| | | fOffset = std::fabs(fAvg2 - fAvg1); // 第äºç - 第ä¸ç |
| | | |
| | | CString strLog; |
| | | strLog.Format(_T("第ä¸çç»çå¹³åå¼: %.3fï¼ç¬¬äºçç»çå¹³åå¼: %.3fï¼åç§»é: %.3f"), fAvg1, fAvg2, fOffset); |
| | | AppendLogLineRichStyled(strLog, LOG_COLOR_SUCCESS); |
| | | |
| | | MEASURE_FUNC_END(); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::InitDataStorage() |
| | | { |
| | | if (!m_bConnected) { |
| | | AppendLogLineRichStyled(_T("è®¾å¤æªè¿æ¥ï¼è¯·å
è¿æ¥è®¾å¤ã"), LOG_COLOR_WARNING); |
| | | return false; |
| | | } |
| | | |
| | | if (m_bSaving) { |
| | | AppendLogLineRichStyled(_T("æ°æ®å卿£å¨è¿è¡ä¸ï¼è¯·å
忢åå¨ã"), LOG_COLOR_WARNING); |
| | | return false; |
| | | } |
| | | |
| | | RC nRet = SGIF_DataStorageInit(DeviceID); |
| | | if (nRet == RC_OK) { |
| | | AppendLogLineRichStyled(_T("æ°æ®åå¨å·²æ¸
é¤ã"), LOG_COLOR_SUCCESS); |
| | | return true; |
| | | } |
| | | |
| | | CString strError; |
| | | strError.Format(_T("æ¸
餿°æ®åå¨å¤±è´¥ï¼é误ç ï¼%#X"), nRet); |
| | | AppendLogLineRichStyled(strError, LOG_COLOR_ERROR); |
| | | return false; |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::StartDataStorage() |
| | | { |
| | | if (m_bSaving) { |
| | | AppendLogLineRichStyled(_T("æ°æ®åå¨å·²å¨è¿è¡ä¸ï¼è¯·å
忢åå¨ã"), LOG_COLOR_WARNING); |
| | | return false; |
| | | } |
| | | |
| | | RC nRet = SGIF_DataStorageStart(DeviceID); |
| | | if (nRet == RC_OK) { |
| | | m_bSaving = TRUE; |
| | | AppendLogLineRichStyled(_T("æ°æ®åå¨å·²å¼å§ã"), LOG_COLOR_SUCCESS); |
| | | return true; |
| | | } |
| | | |
| | | CString strError; |
| | | strError.Format(_T("å¼å§æ°æ®åå¨å¤±è´¥ï¼é误ç ï¼%#X"), nRet); |
| | | AppendLogLineRichStyled(strError, LOG_COLOR_ERROR); |
| | | return false; |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::StopDataStorage() |
| | | { |
| | | if (!m_bSaving) { |
| | | AppendLogLineRichStyled(_T("æ°æ®å卿ªå¨è¿è¡ä¸ï¼è¯·å
å¼å§åå¨ã"), LOG_COLOR_WARNING); |
| | | return false; |
| | | } |
| | | |
| | | RC nRet = SGIF_DataStorageStop(DeviceID); |
| | | if (nRet == RC_OK) { |
| | | m_bSaving = FALSE; |
| | | AppendLogLineRichStyled(_T("æ°æ®åå¨å·²åæ¢ã"), LOG_COLOR_SUCCESS); |
| | | return true; |
| | | } |
| | | |
| | | CString strError; |
| | | strError.Format(_T("åæ¢æ°æ®åå¨å¤±è´¥ï¼é误ç ï¼%#X"), nRet); |
| | | AppendLogLineRichStyled(strError, LOG_COLOR_ERROR); |
| | | return false; |
| | | } |
| | | |
| | | float CSGMeasurementDlg::AnalyzeStoredData(int nOutNo) |
| | | { |
| | | MEASURE_FUNC_START(); |
| | | |
| | | UpdateData(TRUE); |
| | | |
| | | if (m_nUseTrigger) { |
| | | UpdateControlStatus(m_bConnected, m_bSaving); |
| | | AfxMessageBox(_T("å½åæ¯ç¡¬è§¦å模å¼ï¼è¯·æ£æ¥è§¦åå¨ç¶æã"), MB_ICONINFORMATION); |
| | | return -1.0f; |
| | | } |
| | | |
| | | if (!m_bConnected) { |
| | | AppendLogLineRichStyled(_T("è®¾å¤æªè¿æ¥ï¼è¯·å
è¿æ¥è®¾å¤ã"), LOG_COLOR_WARNING); |
| | | return -1.0f; |
| | | } |
| | | |
| | | if (m_bSaving) { |
| | | AppendLogLineRichStyled(_T("æ°æ®å卿£å¨è¿è¡ä¸ï¼è¯·å
忢åå¨ã"), LOG_COLOR_WARNING); |
| | | return -1.0f; |
| | | } |
| | | |
| | | if (nOutNo < 1 || nOutNo > 4) { |
| | | AppendLogLineRichStyled(_T("è¾åºç«¯å£ç¼å·æ æï¼å¿
é¡»å¨ 1 å° 4 ä¹é´ã"), LOG_COLOR_ERROR); |
| | | return -1.0f; |
| | | } |
| | | |
| | | if (m_nSavePointCount < 0) { |
| | | AppendLogLineRichStyled(_T("æ°æ®ç¹æ°å¿
é¡»å¤§äº 0ã"), LOG_COLOR_ERROR); |
| | | return -1.0f; |
| | | } |
| | | |
| | | std::vector<float> vecBuffer(m_nSavePointCount, 0.0f); |
| | | int nReceived = 0; |
| | | |
| | | RC nRet = SGIF_DataStorageGetData(DeviceID, nOutNo, m_nSavePointCount, vecBuffer.data(), &nReceived); |
| | | if (nRet != RC_OK) { |
| | | CString strError; |
| | | strError.Format(_T("读å OUT%d æ°æ®å¤±è´¥ï¼é误ç ï¼%#X"), nOutNo, nRet); |
| | | AppendLogLineRichStyled(strError, LOG_COLOR_ERROR); |
| | | return -1.0f; |
| | | } |
| | | |
| | | vecBuffer.resize(nReceived); |
| | | CleanInvalidValuesInPlace(nOutNo, vecBuffer); |
| | | |
| | | std::vector<float> vecGlass1, vecGlass2; |
| | | if (!SplitGlassSegments(nOutNo, vecBuffer, vecGlass1, vecGlass2, m_fJumpThreshold, m_nJumpWindow, m_nValleyMargin, m_nMinGlass1Count)) { |
| | | AppendLogLineRichStyled(_T("æªè½è¯å«åºä¸¤çç»ççæ°æ®ã"), LOG_COLOR_WARNING); |
| | | return -1.0f; |
| | | } |
| | | |
| | | std::vector<float> vecGlass1Filtered, vecGlass2Filtered; |
| | | bool bGlass1Filtered = FilterDominantGroup(nOutNo, vecGlass1, vecGlass1Filtered); |
| | | bool bGlass2Filtered = FilterDominantGroup(nOutNo, vecGlass2, vecGlass2Filtered); |
| | | |
| | | if (!bGlass1Filtered) { |
| | | AppendLogLineRichStyled(_T("Glass1 åæ®µä¸æªè½è¯å«åºä¸»æ°æ®ç»ï¼ä½¿ç¨åå§æ°æ®ã"), LOG_COLOR_WARNING); |
| | | vecGlass1Filtered = vecGlass1; |
| | | } |
| | | else { |
| | | AppendLogLineRichStyled(_T("Glass1 ä¸»æ°æ®ç»å·²æåã"), LOG_COLOR_SUCCESS); |
| | | } |
| | | |
| | | if (!bGlass2Filtered) { |
| | | AppendLogLineRichStyled(_T("Glass2 åæ®µä¸æªè½è¯å«åºä¸»æ°æ®ç»ï¼ä½¿ç¨åå§æ°æ®ã"), LOG_COLOR_WARNING); |
| | | vecGlass2Filtered = vecGlass2; |
| | | } |
| | | else { |
| | | AppendLogLineRichStyled(_T("Glass2 ä¸»æ°æ®ç»å·²æåã"), LOG_COLOR_SUCCESS); |
| | | } |
| | | |
| | | std::vector<float> vecStable1, vecStable2; |
| | | bool bStable1 = ExtractStableRegionFixed(nOutNo, vecGlass1Filtered, vecStable1, m_nFixedCount, m_fMaxDelta); |
| | | bool bStable2 = ExtractStableRegionFixed(nOutNo, vecGlass2Filtered, vecStable2, m_nFixedCount, m_fMaxDelta); |
| | | |
| | | float fAvg1 = 0.0f, fAvg2 = 0.0f, fOffset = 0.0f; |
| | | if (bStable1 && bStable2) { |
| | | AppendLogLineRichStyled(_T("æåæåå°ä¸¤çç»çç稳å®åºæ°æ®ã"), LOG_COLOR_SUCCESS); |
| | | CalcGlassOffset(vecStable1, vecStable2, fAvg1, fAvg2, fOffset); |
| | | } |
| | | else { |
| | | AppendLogLineRichStyled(_T("æªè½æåå°ç¨³å®åºæ°æ®ï¼å°è¯ä½¿ç¨åå§åæ®µæ°æ®è®¡ç®åç§»ã"), LOG_COLOR_WARNING); |
| | | CalcGlassOffset(vecGlass1, vecGlass2, fAvg1, fAvg2, fOffset); |
| | | } |
| | | |
| | | MEASURE_FUNC_END(); |
| | | |
| | | return fOffset; |
| | | } |
| | | |
| | | BEGIN_MESSAGE_MAP(CSGMeasurementDlg, CDialogEx) |
| | | ON_WM_SYSCOMMAND() |
| | | ON_WM_PAINT() |
| | | ON_WM_QUERYDRAGICON() |
| | | ON_WM_TIMER() |
| | | ON_WM_MEASUREITEM() |
| | | ON_WM_DRAWITEM() |
| | | ON_WM_CLOSE() |
| | | ON_MESSAGE(WM_TRAY_ICON_NOTIFY, &CSGMeasurementDlg::OnTrayIconClick) |
| | | ON_COMMAND(ID_TRAY_RESTORE, &CSGMeasurementDlg::OnTrayRestore) |
| | | ON_COMMAND(ID_TRAY_EXIT, &CSGMeasurementDlg::OnTrayExit) |
| | | ON_BN_CLICKED(IDC_BUTTON_CONNECT, &CSGMeasurementDlg::OnBnClickedButtonConnect) |
| | | ON_BN_CLICKED(IDC_BUTTON_DISCONNECT, &CSGMeasurementDlg::OnBnClickedButtonDisconnect) |
| | | ON_BN_CLICKED(IDC_BUTTON_RECEIVE_FROM_CTRL, &CSGMeasurementDlg::OnBnClickedButtonReceiveFromCtrl) |
| | | ON_BN_CLICKED(IDC_BUTTON_SEND_TO_CTRL, &CSGMeasurementDlg::OnBnClickedButtonSendToCtrl) |
| | | ON_BN_CLICKED(IDC_BUTTON_CLEAR_STORE, &CSGMeasurementDlg::OnBnClickedButtonClearStore) |
| | | ON_BN_CLICKED(IDC_BUTTON_START_STORE, &CSGMeasurementDlg::OnBnClickedButtonStartStore) |
| | | ON_BN_CLICKED(IDC_BUTTON_STOP_STORE, &CSGMeasurementDlg::OnBnClickedButtonStopStore) |
| | | ON_BN_CLICKED(IDC_BUTTON_CLEAR_LOG, &CSGMeasurementDlg::OnBnClickedButtonClearLog) |
| | | END_MESSAGE_MAP() |
| | | |
| | | BOOL CSGMeasurementDlg::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | // å°âå
³äº...âèå项添å å°ç³»ç»èåä¸ã |
| | | |
| | | // IDM_ABOUTBOX å¿
é¡»å¨ç³»ç»å½ä»¤èå´å
ã |
| | | ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); |
| | | ASSERT(IDM_ABOUTBOX < 0xF000); |
| | | |
| | | CMenu* pSysMenu = GetSystemMenu(FALSE); |
| | | if (pSysMenu != nullptr) |
| | | { |
| | | BOOL bNameValid; |
| | | CString strAboutMenu; |
| | | bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); |
| | | ASSERT(bNameValid); |
| | | if (!strAboutMenu.IsEmpty()) |
| | | { |
| | | pSysMenu->AppendMenu(MF_SEPARATOR); |
| | | pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); |
| | | } |
| | | } |
| | | |
| | | // 设置æ¤å¯¹è¯æ¡ç徿 ã å½åºç¨ç¨åºä¸»çªå£ä¸æ¯å¯¹è¯æ¡æ¶ï¼æ¡æ¶å°èªå¨ |
| | | // æ§è¡æ¤æä½ |
| | | SetIcon(m_hIcon, TRUE); // è®¾ç½®å¤§å¾æ |
| | | SetIcon(m_hIcon, FALSE); // 设置å°å¾æ |
| | | |
| | | // TODO: 卿¤æ·»å é¢å¤çåå§å代ç |
| | | UpdateData(FALSE); |
| | | UpdateControlStatus(FALSE, FALSE); |
| | | |
| | | // æç徿 åå§å |
| | | m_trayIconData.cbSize = sizeof(NOTIFYICONDATA); // 设置æç徿 æ°æ®ç»æçå¤§å° |
| | | m_trayIconData.hWnd = m_hWnd; // 设置çªå£å¥æ |
| | | m_trayIconData.uID = m_nTrayIconID; // 设置æç徿 ID |
| | | m_trayIconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; // 设置æç徿 çæ å¿ï¼å¾æ ãæ¶æ¯ãæç¤ºææ¬ï¼ |
| | | m_trayIconData.uCallbackMessage = WM_TRAY_ICON_NOTIFY; // 设置åè°æ¶æ¯ WM_TRAY_ICON_NOTIFY |
| | | m_trayIconData.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // å è½½æç徿 |
| | | lstrcpy(m_trayIconData.szTip, TRAY_ICON_TOOLTIP_TEXT); // 设置æçæç¤ºææ¬ |
| | | |
| | | // æ·»å æç徿 |
| | | Shell_NotifyIcon(NIM_ADD, &m_trayIconData); |
| | | m_bTrayIconCreated = TRUE; |
| | | |
| | | for (int i = 0; i < 4; i++) { |
| | | CString str; |
| | | str.Format(_T("OUT%d"), i + 1); |
| | | m_comboOutputPort.AddString(str); |
| | | } |
| | | m_comboOutputPort.SetCurSel(0); |
| | | |
| | | // åå§åIPå°åæ§ä»¶ï¼è®¾ç½®ä¸ºé»è®¤IPå°å |
| | | ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS))->SetAddress(192, 168, 0, 10); |
| | | |
| | | // 设置 PLC çå¬å¨çæ¥å¿åè°å½æ° |
| | | m_plcListener.SetLogCallback([this](const CString& msg, int type) { |
| | | if (type == -1) { |
| | | AppendLogLineRichStyled(msg, LOG_COLOR_ERROR); |
| | | } |
| | | else if (type == 0) { |
| | | AppendLogLineRichStyled(msg, LOG_COLOR_SUCCESS); |
| | | } |
| | | else if (type == 1) { |
| | | AppendLogLineRichStyled(msg, LOG_COLOR_WARNING); |
| | | } |
| | | else if (type == 2) { |
| | | AppendLogLineRichStyled(msg, LOG_COLOR_NORMAL); |
| | | } |
| | | }); |
| | | |
| | | // åå§å PLC çå¬å¨ |
| | | m_plcListener.Initialize(StationIdentifier(0, 255), 200); |
| | | |
| | | // 设置 PLC çå¬å¨çå¼å§ééåè°å½æ° |
| | | m_plcListener.SetStartCallback([this]() { |
| | | if (!m_bConnected) { |
| | | ConnectToDevice(); |
| | | } |
| | | |
| | | if (InitDataStorage()) { |
| | | StartDataStorage(); |
| | | UpdateControlStatus(m_bConnected, m_bSaving); |
| | | } |
| | | }); |
| | | |
| | | // 设置 PLC çå¬å¨ç忢ééåè°å½æ° |
| | | m_plcListener.SetStopCallback([this]() { |
| | | StopDataStorage(); |
| | | UpdateControlStatus(m_bConnected, m_bSaving); |
| | | }); |
| | | |
| | | // 设置 PLC çå¬å¨çåæåè°å½æ° |
| | | m_plcListener.SetAnalyzeCallback([this]() { |
| | | if (!m_bConnected) { |
| | | AppendLogLineRichStyled(_T("è®¾å¤æªè¿æ¥ï¼è¯·å
è¿æ¥è®¾å¤ã"), LOG_COLOR_WARNING); |
| | | return std::array<double, 4>{ -1.0, -1.0, -1.0, -1.0 }; |
| | | } |
| | | |
| | | std::array<double, 4> result; |
| | | for (int i = 0; i < 4; ++i) { |
| | | result[i] = AnalyzeStoredData(i + 1); // OUT1 ~ OUT4 |
| | | } |
| | | |
| | | if (std::any_of(result.begin(), result.end(), [](double v) { return v < 0; })) { |
| | | AppendLogLineRichStyled(_T("åæå¤±è´¥ï¼æäºè¾åºç«¯å£æ°æ®æ æã"), LOG_COLOR_ERROR); |
| | | return std::array<double, 4>{ -1.0, -1.0, -1.0, -1.0 }; |
| | | } |
| | | |
| | | CString strLog; |
| | | strLog.Format(_T("åæç»æï¼OUT1: %.3f, OUT2: %.3f, OUT3: %.3f, OUT4: %.3f"), result[0], result[1], result[2], result[3]); |
| | | return result; |
| | | }); |
| | | m_plcListener.Start(); |
| | | |
| | | // åå§åæ¥å¿æ¡ |
| | | AppendLogLineRichStyled(_T("åå¤å°±ç»ª..."), LOG_COLOR_SUCCESS); |
| | | |
| | | return TRUE; // é¤éå°ç¦ç¹è®¾ç½®å°æ§ä»¶ï¼å¦åè¿å TRUE |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnSysCommand(UINT nID, LPARAM lParam) |
| | | { |
| | | if ((nID & 0xFFF0) == IDM_ABOUTBOX) |
| | | { |
| | | CAboutDlg dlgAbout; |
| | | dlgAbout.DoModal(); |
| | | } |
| | | else |
| | | { |
| | | CDialogEx::OnSysCommand(nID, lParam); |
| | | } |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnPaint() |
| | | { |
| | | if (IsIconic()) { |
| | | CPaintDC dc(this); |
| | | |
| | | SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); |
| | | |
| | | // ä½¿å¾æ å¨å·¥ä½åºç©å½¢ä¸å±
ä¸ |
| | | int cxIcon = GetSystemMetrics(SM_CXICON); |
| | | int cyIcon = GetSystemMetrics(SM_CYICON); |
| | | CRect rect; |
| | | GetClientRect(&rect); |
| | | int x = (rect.Width() - cxIcon + 1) / 2; |
| | | int y = (rect.Height() - cyIcon + 1) / 2; |
| | | |
| | | // ç»å¶å¾æ |
| | | dc.DrawIcon(x, y, m_hIcon); |
| | | } |
| | | else { |
| | | CDialogEx::OnPaint(); |
| | | } |
| | | } |
| | | |
| | | //å½ç¨æ·æå¨æå°åçªå£æ¶ç³»ç»è°ç¨æ¤å½æ°åå¾å
æ æ¾ç¤ºã |
| | | HCURSOR CSGMeasurementDlg::OnQueryDragIcon() |
| | | { |
| | | return static_cast<HCURSOR>(m_hIcon); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnTimer(UINT_PTR nIDEvent) |
| | | { |
| | | // TODO: 卿¤æ·»å æ¶æ¯å¤çç¨åºä»£ç å/æè°ç¨é»è®¤å¼ |
| | | if (nIDEvent == TIMER_ID_OUTPUT_UPDATE) { |
| | | SGIF_FLOATVALUE_OUT value[4] = { 0 }; |
| | | RC nRet = SGIF_GetCalcDataALL(DeviceID, value); |
| | | if (nRet == RC_OK) { |
| | | for (int i = 0; i < 4; ++i) { |
| | | m_dOutValues[i] = value[i].Value; |
| | | } |
| | | |
| | | // æ´æ°ç»å®æ§ä»¶ |
| | | UpdateData(FALSE); |
| | | } |
| | | else { |
| | | CString strError; |
| | | strError.Format(_T("è·åæµéå¼å¤±è´¥ï¼é误ç ï¼%#X"), nRet); |
| | | AppendLogLineRichStyled(strError, LOG_COLOR_ERROR); |
| | | |
| | | // æå¼è¿æ¥ |
| | | if (m_bConnected) { |
| | | DisconnectFromDevice(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | CDialogEx::OnTimer(nIDEvent); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) |
| | | { |
| | | if (lpMeasureItemStruct->CtlType == ODT_MENU) { |
| | | lpMeasureItemStruct->itemHeight = 24; |
| | | lpMeasureItemStruct->itemWidth = 140; |
| | | } |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) |
| | | { |
| | | if (lpDrawItemStruct->CtlType != ODT_MENU) { |
| | | return; |
| | | } |
| | | |
| | | CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); |
| | | CRect rc = lpDrawItemStruct->rcItem; |
| | | UINT id = lpDrawItemStruct->itemID; |
| | | |
| | | // èæ¯ |
| | | COLORREF bgColor = (lpDrawItemStruct->itemState & ODS_SELECTED) ? RGB(200, 220, 255) : RGB(255, 255, 255); |
| | | pDC->FillSolidRect(rc, bgColor); |
| | | |
| | | // 徿 |
| | | HICON hIcon = nullptr; |
| | | if (id == ID_TRAY_RESTORE) { |
| | | hIcon = AfxGetApp()->LoadIcon(IDI_ICON_RESTORE); |
| | | } |
| | | |
| | | if (id == ID_TRAY_EXIT) { |
| | | hIcon = AfxGetApp()->LoadIcon(IDI_ICON_EXIT); |
| | | } |
| | | |
| | | if (hIcon) { |
| | | DrawIconEx(pDC->GetSafeHdc(), rc.left + 4, rc.top + 4, hIcon, 16, 16, 0, NULL, DI_NORMAL); |
| | | } |
| | | |
| | | // ææ¬ |
| | | CString str; |
| | | if (id == ID_TRAY_RESTORE) { |
| | | str = _T("æ¢å¤çé¢"); |
| | | } |
| | | |
| | | if (id == ID_TRAY_EXIT) { |
| | | str = _T("éåºç¨åº"); |
| | | } |
| | | |
| | | pDC->SetBkMode(TRANSPARENT); |
| | | pDC->SetTextColor(RGB(0, 0, 0)); |
| | | pDC->DrawText(str, CRect(rc.left + 28, rc.top, rc.right, rc.bottom), DT_SINGLELINE | DT_VCENTER | DT_LEFT); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnClose() |
| | | { |
| | | // TODO: 卿¤æ·»å æ¶æ¯å¤çç¨åºä»£ç å/æè°ç¨é»è®¤å¼ |
| | | if (m_bExitingFromTray) { |
| | | // 仿çéåºæµç¨ |
| | | ExitApplication(); |
| | | } |
| | | else { |
| | | // æ£å¸¸å
³éæé® |
| | | int nResult = AfxMessageBox(_T("æ¯å¦æå°åå°æçï¼"), MB_YESNO | MB_ICONQUESTION); |
| | | if (nResult == IDYES) { |
| | | ShowWindow(SW_HIDE); |
| | | } |
| | | else { |
| | | ExitApplication(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | LRESULT CSGMeasurementDlg::OnTrayIconClick(WPARAM wParam, LPARAM lParam) { |
| | | if (wParam == m_nTrayIconID) { |
| | | if (LOWORD(lParam) == WM_LBUTTONUP) { |
| | | // å·¦é®ç¹å»æ¢å¤çªå£ |
| | | ShowWindow(SW_SHOW); |
| | | SetForegroundWindow(); |
| | | } |
| | | else if (LOWORD(lParam) == WM_RBUTTONUP) { |
| | | // å³é®ç¹å»å¼¹åºèå |
| | | CMenu menu; |
| | | menu.CreatePopupMenu(); |
| | | menu.AppendMenu(MF_OWNERDRAW, ID_TRAY_RESTORE, (LPCTSTR)ID_TRAY_RESTORE); |
| | | menu.AppendMenu(MF_OWNERDRAW, ID_TRAY_EXIT, (LPCTSTR)ID_TRAY_EXIT); |
| | | |
| | | // å è½½å¾æ |
| | | HICON hIconRestore = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_RESTORE), IMAGE_ICON, 16, 16, LR_SHARED); |
| | | HICON hIconExit = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_EXIT), IMAGE_ICON, 16, 16, LR_SHARED); |
| | | |
| | | // è®¾ç½®å¾æ å°èå项 |
| | | MENUITEMINFO mii = { sizeof(MENUITEMINFO) }; |
| | | mii.fMask = MIIM_BITMAP; |
| | | |
| | | // æ¢å¤èå项徿 |
| | | mii.hbmpItem = HBMMENU_CALLBACK; |
| | | menu.SetMenuItemInfo(ID_TRAY_RESTORE, &mii); |
| | | |
| | | // éåºèå项徿 |
| | | mii.hbmpItem = HBMMENU_CALLBACK; |
| | | menu.SetMenuItemInfo(ID_TRAY_EXIT, &mii); |
| | | |
| | | // è·åé¼ æ å½åä½ç½®ï¼å¹¶æ¾ç¤ºèå |
| | | POINT pt; |
| | | GetCursorPos(&pt); |
| | | SetForegroundWindow(); |
| | | menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this); |
| | | } |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnTrayRestore() |
| | | { |
| | | ShowWindow(SW_SHOW); // æ¢å¤çªå£ |
| | | SetForegroundWindow(); // å°çªå£ç½®äºå端 |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnTrayExit() |
| | | { |
| | | // 仿ç徿 èåéæ©âéåºç¨åºâ |
| | | if (AfxMessageBox(_T("ç¡®å®è¦éåºç¨åºåï¼"), MB_YESNO | MB_ICONQUESTION) == IDYES) { |
| | | m_bExitingFromTray = TRUE; |
| | | PostMessage(WM_CLOSE); |
| | | } |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnBnClickedButtonConnect() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | ConnectToDevice(); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnBnClickedButtonDisconnect() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | DisconnectFromDevice(); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnBnClickedButtonReceiveFromCtrl() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | if (!m_bConnected) { |
| | | AppendLogLineRichStyled(_T("è®¾å¤æªè¿æ¥ï¼è¯·å
è¿æ¥è®¾å¤ã"), LOG_COLOR_WARNING); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnBnClickedButtonSendToCtrl() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | if (!m_bConnected) { |
| | | AppendLogLineRichStyled(_T("è®¾å¤æªè¿æ¥ï¼è¯·å
è¿æ¥è®¾å¤ã"), LOG_COLOR_WARNING); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnBnClickedButtonClearStore() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | InitDataStorage(); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnBnClickedButtonStartStore() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | StartDataStorage(); |
| | | UpdateControlStatus(m_bConnected, m_bSaving); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnBnClickedButtonStopStore() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | StopDataStorage(); |
| | | UpdateControlStatus(m_bConnected, m_bSaving); |
| | | |
| | | int nSel = m_comboOutputPort.GetCurSel(); |
| | | if (CB_ERR == nSel) { |
| | | AppendLogLineRichStyled(_T("è¯·éæ©ä¸ä¸ªææçè¾åºç«¯å£ã"), LOG_COLOR_WARNING); |
| | | return; |
| | | } |
| | | |
| | | int nOutNo = nSel + 1; |
| | | AnalyzeStoredData(nOutNo); |
| | | } |
| | | |
| | | void CSGMeasurementDlg::OnBnClickedButtonClearLog() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | if (::IsWindow(m_editLog.GetSafeHwnd())) { |
| | | m_editLog.SetWindowText(_T("")); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | |  |
| | | // SGMeasurementDlg.h: 头æä»¶ |
| | | // |
| | | |
| | | #pragma once |
| | | |
| | | #include "PLCSignalListener.h" |
| | | |
| | | #include <map> |
| | | #include <vector> |
| | | #include <numeric> |
| | | #include <algorithm> |
| | | |
| | | // CSGMeasurementDlg å¯¹è¯æ¡ |
| | | class CSGMeasurementDlg : public CDialogEx |
| | | { |
| | | // æé |
| | | public: |
| | | CSGMeasurementDlg(CWnd* pParent = nullptr); // æ åæé 彿° |
| | | |
| | | // å¯¹è¯æ¡æ°æ® |
| | | #ifdef AFX_DESIGN_TIME |
| | | enum { IDD = IDD_SGMEASUREMENT_DIALOG }; |
| | | #endif |
| | | |
| | | protected: |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ |
| | | |
| | | // å®ç° |
| | | protected: |
| | | HICON m_hIcon; |
| | | |
| | | // çæçæ¶æ¯æ å°å½æ° |
| | | virtual BOOL OnInitDialog(); |
| | | afx_msg void OnSysCommand(UINT nID, LPARAM lParam); |
| | | afx_msg void OnPaint(); |
| | | afx_msg HCURSOR OnQueryDragIcon(); |
| | | afx_msg void OnTimer(UINT_PTR nIDEvent); |
| | | afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct); |
| | | afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct); |
| | | afx_msg void OnClose(); |
| | | afx_msg LRESULT OnTrayIconClick(WPARAM wParam, LPARAM lParam); |
| | | afx_msg void OnTrayRestore(); |
| | | afx_msg void OnTrayExit(); |
| | | afx_msg void OnBnClickedButtonConnect(); |
| | | afx_msg void OnBnClickedButtonDisconnect(); |
| | | afx_msg void OnBnClickedButtonReceiveFromCtrl(); |
| | | afx_msg void OnBnClickedButtonSendToCtrl(); |
| | | afx_msg void OnBnClickedButtonClearStore(); |
| | | afx_msg void OnBnClickedButtonStartStore(); |
| | | afx_msg void OnBnClickedButtonStopStore(); |
| | | afx_msg void OnBnClickedButtonClearLog(); |
| | | DECLARE_MESSAGE_MAP() |
| | | |
| | | private: |
| | | /** |
| | | * @brief éåºç¨åºæ¶çæ¸
çæä½ã |
| | | * |
| | | * æ¤å½æ°å¨ç¨åºéåºå被è°ç¨ï¼ç¨äºæ§è¡å¿
è¦çèµæºéæ¾ä¸ç¶ææ¢å¤ï¼ |
| | | * å
æ¬æå¼è®¾å¤è¿æ¥ãç§»é¤æç徿 çã |
| | | * æç»éæ¯ä¸»çªå£å¹¶éåºåºç¨ã |
| | | */ |
| | | void ExitApplication(); |
| | | |
| | | /** |
| | | * @brief æ´æ°ç颿§ä»¶çå¯ç¨ç¶æã |
| | | * |
| | | * æ ¹æ®è®¾å¤è¿æ¥ç¶æ `bConnected` ååå¨ç¶æ `bStoring` 卿æ§å¶çé¢ä¸æé®ã |
| | | * ç¼è¾æ¡ã䏿æ¡çæ§ä»¶çå¯ç¨/ç¦ç¨ç¶æã |
| | | * |
| | | * @param bConnected 设å¤å½åæ¯å¦å·²è¿æ¥ï¼TRUE è¡¨ç¤ºå·²è¿æ¥ï¼FALSE 表示æªè¿æ¥ã |
| | | * @param bStoring å½åæ¯å¦æ£å¨è¿è¡æ°æ®åå¨ï¼TRUE 表示æ£å¨åå¨ã |
| | | */ |
| | | void UpdateControlStatus(BOOL bConnected, BOOL bStoring = FALSE); |
| | | |
| | | /** |
| | | * @brief å¯å¨æ¹éæ¥å¿è¿½å ï¼æåèªå¨æ»å¨ï¼æé«æ§è½ã |
| | | */ |
| | | void AppendLogLineBatchBegin(); |
| | | |
| | | /** |
| | | * @brief ç»ææ¹éæ¥å¿è¿½å ï¼æ¢å¤èªå¨æ»å¨å¹¶å·æ°æ¾ç¤ºã |
| | | */ |
| | | void AppendLogLineBatchEnd(); |
| | | |
| | | /** |
| | | * @brief éå¶å¯ææ¬æ¡ä¸çæå¤§è¡æ°ï¼é¿å
æ¥å¿è¿å¤å¯¼è´æ§è½é®é¢ã |
| | | * |
| | | * @param maxLines æå¤§ä¿ççè¡æ°ï¼é»è®¤å¼ä¸º 100ã |
| | | */ |
| | | void TrimRichEditLineLimit(int maxLines = 100); |
| | | |
| | | /** |
| | | * @brief 忥å¿çªå£è¿½å 䏿¡å¸¦é¢è²æ ·å¼çæ¥å¿è¡ã |
| | | * |
| | | * @param content æ¥å¿å
容ã |
| | | * @param color åä½é¢è²ï¼é»è®¤ä¸ºé»è²ã |
| | | */ |
| | | void AppendLogLineRichStyled(const CString& strContent, COLORREF color = RGB(0, 0, 0)); |
| | | |
| | | /** |
| | | * @brief é«äº®æ¥å¿ä¸ææå¹é
æå®å符串çé¨åã |
| | | * |
| | | * @param strSearch è¦å¹é
çå符串ã |
| | | * @param clrHighlight é«äº®é¢è²ï¼é»è®¤ä¸ºæ©è²ï¼RGB(255, 165, 0)ï¼ã |
| | | */ |
| | | void HighlightAllMatches(const CString& strSearch, COLORREF clrHighlight = RGB(255, 165, 0)); |
| | | |
| | | /** |
| | | * @brief ä»¥æ ¼å¼åæ¹å¼è¾åºæå®ééçæµéæ°æ®æ ·æ¬å°æ¥å¿ã |
| | | * |
| | | * æ¯è¡è¾åºåºå®æ°éï¼å¦ 7ï¼ä¸ªæµ®ç¹æ°æ®ï¼å¸¦æ¶é´æ³ãééç¼å·æ è¯ï¼ä¾¿äºè°è¯æ¥çã |
| | | * |
| | | * @param nOutNo è¾åºç«¯å£ç¼å·ï¼ç¨äºæ è¯æ¥å¿æ¥æºï¼å¦ OUT1ãOUT2 çã |
| | | * @param vecBuffer æµéæ°æ®ç¼åï¼å°è¢«éè¡æå°å°æ¥å¿ä¸ã |
| | | */ |
| | | void PrintSampleData(int nOutNo, const std::vector<float>& vecBuffer); |
| | | |
| | | /** |
| | | * @brief å°è¯è¿æ¥å°æµé设å¤ã |
| | | * |
| | | * @return true è¡¨ç¤ºè¿æ¥æåï¼false è¡¨ç¤ºè¿æ¥å¤±è´¥ã |
| | | */ |
| | | bool ConnectToDevice(); |
| | | |
| | | /** |
| | | * @brief æå¼ä¸æµé设å¤çè¿æ¥ã |
| | | * |
| | | * @return true 表示æå¼æåï¼false 表示æå¼å¤±è´¥ã |
| | | */ |
| | | bool DisconnectFromDevice(); |
| | | |
| | | /** |
| | | * @brief åå°æ¸
餿 æå¼ï¼å¦ -999.0fï¼å¹¶æ´æ°æ°æ®ã |
| | | * |
| | | * @param nOutNo è¾åºééç¼å·ï¼ç¨äºæ¥å¿è®°å½ã |
| | | * @param vecData è¾å
¥è¾åºæ°æ®å®¹å¨ï¼å
é¨å°è¢«å°±å°è£åªã |
| | | * @param fInvalid æ æå¼ç夿éå¼ï¼é»è®¤å¼ä¸º -999.0fã |
| | | */ |
| | | void CleanInvalidValuesInPlace(int nOutNo, std::vector<float>& vecData, float fInvalid = -999.0f); |
| | | |
| | | /** |
| | | * @brief å°æææ°æ®åå²æä¸¤æ®µç»çæ°æ®ï¼Glass1 ä¸ Glass2ï¼ã |
| | | * |
| | | * @param nOutNo è¾åºééç¼å·ï¼ç¨äºæ¥å¿è®°å½ã |
| | | * @param validData è¾å
¥çæææ°æ®ï¼åºå·²è£åªè¾¹çï¼ã |
| | | * @param vecGlass1 è¾åºç¬¬ä¸æ®µç»çæ°æ®ã |
| | | * @param vecGlass2 è¾åºç¬¬äºæ®µç»çæ°æ®ã |
| | | * @param fJumpThreshold è·³åéå¼ï¼ç¨äºæ£æµæ°æ®çææ¾æç¹ã |
| | | * @param nWindow è·³å夿çååçªå£å®½åº¦ã |
| | | * @param nValleyMargin valley ç¹ä¹åå¤å°ä¸ªç¹ä½ä¸ºå®é
åå²ç¹ã |
| | | * @param nMinGlass1Count æå°ææç¹æ°éå¶ã |
| | | * |
| | | * @return true 表示å岿åï¼false 表示失败ï¼ä¾å¦æ°æ®ä¸è¶³ææ ææ¾è·³åï¼ã |
| | | */ |
| | | bool SplitGlassSegments(int nOutNo, const std::vector<float>& validData, |
| | | std::vector<float>& vecGlass1, std::vector<float>& vecGlass2, |
| | | float fJumpThreshold = 0.2f, int nWindow = 3, int nValleyMargin = 0, |
| | | int nMinGlassCount = 10); |
| | | |
| | | /** |
| | | * @brief å¯¹æ°æ®ææ´æ°é¨åè¿è¡åç»ï¼ä¿çæ°æ®éæå¤çä¸ç»ï¼æé¤å¼å¸¸/å¹²æ°ï¼ã |
| | | * |
| | | * @param nOutNo è¾åºééç¼å·ï¼ç¨äºæ¥å¿è®°å½ã |
| | | * @param vecInput åå§æµ®ç¹æ°æ®ï¼å·²è£åªæ æå¼ï¼ã |
| | | * @param vecOutput è¾åºè¢«ä¿çç主è¦åç»æ°æ®ï¼æå¤çé£ç»ï¼ã |
| | | * |
| | | * @return true 表示æåè¿æ»¤åºä¸»åç»ï¼false è¡¨ç¤ºæææ°æ®é½è¢«è¿æ»¤æä¸ºç©ºã |
| | | */ |
| | | bool FilterDominantGroup(int nOutNo, const std::vector<float>& vecInput, std::vector<float>& vecOutput); |
| | | |
| | | /** |
| | | * @brief ä»è¾å
¥æ°æ®ä¸æåä¸ä¸ªåºå®é¿åº¦ç稳å®åºé´ã |
| | | * |
| | | * @param nOutNo è¾åºééç¼å·ï¼ç¨äºæ¥å¿è®°å½ã |
| | | * @param vecIn è¾å
¥åå§æ°æ®ã |
| | | * @param vecOut è¾åºæåç稳å®åºåæ°æ®ã |
| | | * @param nFixedCount 稳å®åºåçç¹æ°è¦æ±ï¼å¿
é¡»åºå®æ°éï¼ã |
| | | * @param fMaxDelta å
许çæå¤§æ³¢å¨èå´ï¼æå¤§å¼ - æå°å¼ï¼ã |
| | | * |
| | | * @return true 表示æåæ¾å°ç¨³å®åºé´ï¼false è¡¨ç¤ºæªæ¾å°ã |
| | | */ |
| | | bool ExtractStableRegionFixed(int nOutNo, |
| | | const std::vector<float>& vecIn, |
| | | std::vector<float>& vecOut, |
| | | int nFixedCount = 5, float fMaxDelta = 0.05f); |
| | | |
| | | /** |
| | | * @brief 计ç®ä¸¤çç»ç稳å®åºåçå¹³åå¼ååç§»éã |
| | | * |
| | | * @param vecGlass1 ç¬¬ä¸æ®µç¨³å®æ°æ®ã |
| | | * @param vecGlass2 ç¬¬äºæ®µç¨³å®æ°æ®ã |
| | | * @param fAvg1 è¿åç¬¬ä¸æ®µçå¹³åå¼ã |
| | | * @param fAvg2 è¿åç¬¬äºæ®µçå¹³åå¼ã |
| | | * @param fOffset è¿å两段çåç§»å¼ï¼ç»å¯¹å¼å·®ï¼ã |
| | | * |
| | | * @return true è¡¨ç¤ºè®¡ç®æåï¼false 表示è¾å
¥æ æï¼å¦ç©ºæ°æ®ï¼ã |
| | | */ |
| | | bool CalcGlassOffset(const std::vector<float>& vecGlass1, |
| | | const std::vector<float>& vecGlass2, |
| | | float& fAvg1, float& fAvg2, float& fOffset); |
| | | |
| | | /** |
| | | * @brief åå§å设å¤ç«¯çæ°æ®åå¨ç¼å²åºã |
| | | * |
| | | * è°ç¨åºå±æ¥å£æ¸
é¤å½ååå¨åºå
容ï¼ä¸ºæ°ä¸è½®çæ°æ®ééååå¤ã |
| | | * å¿
é¡»å¨è®¾å¤è¿æ¥æå䏿ªè¿è¡æ°æ®å卿¶è°ç¨ã |
| | | * |
| | | * @return true 表示åå§åæåï¼false 表示失败ï¼å¯è½æ¯è®¾å¤æªè¿æ¥æè°ç¨æ¥å£é误ï¼ã |
| | | */ |
| | | bool InitDataStorage(); |
| | | |
| | | /** |
| | | * @brief å¯å¨è®¾å¤ç«¯æ°æ®ééååå¨ã |
| | | * |
| | | * è°ç¨æ¤å½æ°å设å¤å¼å§ééå¹¶ç¼åæ°æ®ã |
| | | * é常é
åè§¦åæ¨¡å¼è¿è¡ééã |
| | | * |
| | | * @return true 表示å¯å¨æåï¼false 表示å¯å¨å¤±è´¥ã |
| | | */ |
| | | bool StartDataStorage(); |
| | | |
| | | /** |
| | | * @brief åæ¢æ°æ®ééå¹¶ä»è®¾å¤è·åå½åå卿°æ®ã |
| | | * |
| | | * è°ç¨å设å¤åæ¢ééï¼å¹¶å°è¯è¯»åæå®ç«¯å£çæ°æ®ï¼ä¾åç»åæå¤çã |
| | | * |
| | | * @return true è¡¨ç¤ºåæ¢å¹¶è¯»åæ°æ®æåï¼false 表示失败ï¼å¦è®¾å¤æªååºææ°æ®æ æï¼ã |
| | | */ |
| | | bool StopDataStorage(); |
| | | |
| | | /** |
| | | * @brief åææå®ç«¯å£çå卿°æ®ï¼å¹¶æå两段ç»çæ°æ®ä¸ç¨³å®åºï¼è®¡ç®åç§»ã |
| | | * |
| | | * @param nOutNo è¾åºç«¯å£ç¼å·ï¼1~4ï¼ |
| | | * @return float æåè¿å计ç®åºçåç§»éï¼å¤±è´¥è¿å -1.0f |
| | | */ |
| | | float AnalyzeStoredData(int nOutNo); |
| | | |
| | | // === ç³»ç»ç¶æä¸è¿è¡æ°æ® === |
| | | |
| | | /** |
| | | * @brief å½åæ¯å¦å·²è¿æ¥å°ä¼ æå¨æ§å¶å¨ |
| | | */ |
| | | bool m_bConnected; |
| | | |
| | | /** |
| | | * @brief å½åæ¯å¦æ£å¨è¿è¡æ°æ®åå¨ |
| | | */ |
| | | bool m_bSaving; |
| | | |
| | | /** |
| | | * @brief å个è¾åºç«¯å£çå½å计ç®ç»æï¼å¦åç§»éæå度çï¼ |
| | | */ |
| | | double m_dOutValues[4]; |
| | | |
| | | // === åå¨è®¾ç½®ç¸å
³ === |
| | | |
| | | /** |
| | | * @brief æ¯å¦ä½¿ç¨ç¡¬ä»¶è§¦åä¿¡å·ï¼0=å¦ï¼1=æ¯ï¼ |
| | | */ |
| | | int m_nUseTrigger; |
| | | |
| | | /** |
| | | * @brief æ¯æ¬¡ééçæ°æ®ç¹æ°é |
| | | */ |
| | | int m_nSavePointCount; |
| | | |
| | | /** |
| | | * @brief è¾åºç«¯å£éæ©ä¸ææ¡æ§ä»¶ï¼ç¨äºè®¾ç½®éé端å£ï¼ |
| | | */ |
| | | CComboBox m_comboOutputPort; |
| | | |
| | | // === è·³åæ£æµä¸ç»çè¯å«åæ°ï¼SplitGlassSegments 使ç¨ï¼ === |
| | | |
| | | /** |
| | | * @brief è·³åéå¼ï¼ä¾å¦ 0.2mmï¼ï¼ç¨äºæ£æµä¸¤çç»çä¹é´çé«åº¦è·³å |
| | | */ |
| | | float m_fJumpThreshold; |
| | | |
| | | /** |
| | | * @brief è·³åæ£æµçªå£å宽度ï¼ç¨äºå·®å计ç®ï¼ |
| | | */ |
| | | int m_nJumpWindow; |
| | | |
| | | /** |
| | | * @brief valley ç¹å³ç§»çåç§»éï¼ç¨äºæç»ç¡®å®åå²ç¹ |
| | | */ |
| | | int m_nValleyMargin; |
| | | |
| | | /** |
| | | * @brief 第ä¸çç»çæå°æéçæ°æ®ç¹æ° |
| | | */ |
| | | int m_nMinGlass1Count; |
| | | |
| | | // === 稳å®åºåæååæ°ï¼ExtractStableRegionFixed 使ç¨ï¼ === |
| | | |
| | | /** |
| | | * @brief æ¯æ®µç¨³å®åºåè¦æåçåºå®æ°æ®ç¹æ° |
| | | */ |
| | | int m_nFixedCount; |
| | | |
| | | /** |
| | | * @brief æå¤§å
许波å¨èå´ï¼ä¾å¦ 0.05mmï¼ï¼å¤ææ¯å¦ä¸ºâ稳å®âåºå |
| | | */ |
| | | float m_fMaxDelta; |
| | | |
| | | // === æ¥å¿æ§ä»¶ === |
| | | |
| | | /** |
| | | * @brief å¯ææ¬æ§ä»¶ï¼ç¨äºè¾åºå¸¦é¢è²çæ¥å¿ä¿¡æ¯ |
| | | */ |
| | | CRichEditCtrl m_editLog; |
| | | |
| | | // === æç徿 管ç === |
| | | |
| | | /** |
| | | * @brief æç徿 ç¸å
³æ°æ®ç»æï¼NOTIFYICONDATAï¼ |
| | | */ |
| | | NOTIFYICONDATA m_trayIconData; |
| | | |
| | | /** |
| | | * @brief æç徿 çå¯ä¸ ID |
| | | */ |
| | | UINT m_nTrayIconID; |
| | | |
| | | /** |
| | | * @brief æ è®°æç徿 æ¯å¦å·²æåå建 |
| | | */ |
| | | BOOL m_bTrayIconCreated; |
| | | |
| | | /** |
| | | * @brief æ è®°ç¨åºæ¯å¦éè¿æç徿 éåº |
| | | */ |
| | | BOOL m_bExitingFromTray; |
| | | |
| | | // === PLC ä¿¡å·çå¬å¨ === |
| | | |
| | | /** |
| | | * @brief PLC ä¿¡å·çå¬å¨å®ä¾ï¼ç¨äºå¤ç PLC ä¿¡å·äºä»¶ |
| | | */ |
| | | CPLCSignalListener m_plcListener; |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | |
| | | #ifndef VC_EXTRALEAN |
| | | #define VC_EXTRALEAN // ä» Windows 头䏿餿å°ä½¿ç¨çèµæ |
| | | #endif |
| | | |
| | | #include "targetver.h" |
| | | |
| | | #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // æäº CString æé 彿°å°æ¯æ¾å¼ç |
| | | |
| | | // å
³é MFC çä¸äºå¸¸è§ä¸ç»å¸¸å¯æ¾å¿å¿½ç¥çéèè¦åæ¶æ¯ |
| | | #define _AFX_ALL_WARNINGS |
| | | |
| | | #include <afxwin.h> // MFC æ ¸å¿ç»ä»¶åæ åç»ä»¶ |
| | | #include <afxext.h> // MFC æ©å± |
| | | |
| | | |
| | | #include <afxdisp.h> // MFC èªå¨åç±» |
| | | |
| | | |
| | | |
| | | #ifndef _AFX_NO_OLE_SUPPORT |
| | | #include <afxdtctl.h> // MFC 对 Internet Explorer 4 å
Œ
±æ§ä»¶çæ¯æ |
| | | #endif |
| | | #ifndef _AFX_NO_AFXCMN_SUPPORT |
| | | #include <afxcmn.h> // MFC 对 Windows å
Œ
±æ§ä»¶çæ¯æ |
| | | #endif // _AFX_NO_AFXCMN_SUPPORT |
| | | |
| | | #include <afxcontrolbars.h> // MFC æ¯æåè½åºåæ§å¶æ¡ |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | #ifdef _UNICODE |
| | | #if defined _M_IX86 |
| | | #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") |
| | | #elif defined _M_X64 |
| | | #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") |
| | | #else |
| | | #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") |
| | | #endif |
| | | #endif |
| | | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // pch.cpp: ä¸é¢ç¼è¯æ 头对åºçæºæä»¶ |
| | | |
| | | #include "pch.h" |
| | | |
| | | // å½ä½¿ç¨é¢ç¼è¯ç头æ¶ï¼éè¦ä½¿ç¨æ¤æºæä»¶ï¼ç¼è¯æè½æåã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // pch.h: è¿æ¯é¢ç¼è¯æ 头æä»¶ã |
| | | // 䏿¹ååºçæä»¶ä»
ç¼è¯ä¸æ¬¡ï¼æé«äºå°æ¥çæççææ§è½ã |
| | | // è¿è¿å°å½±å IntelliSense æ§è½ï¼å
æ¬ä»£ç 宿å许å¤ä»£ç æµè§åè½ã |
| | | // 使¯ï¼å¦ææ¤å¤ååºçæä»¶ä¸çä»»ä½ä¸ä¸ªå¨çæä¹é´ææ´æ°ï¼å®ä»¬å
¨é¨é½å°è¢«éæ°ç¼è¯ã |
| | | // 请å¿å¨æ¤å¤æ·»å è¦é¢ç¹æ´æ°çæä»¶ï¼è¿å°ä½¿å¾æ§è½ä¼å¿æ æã |
| | | |
| | | #ifndef PCH_H |
| | | #define PCH_H |
| | | |
| | | // æ·»å è¦å¨æ¤å¤é¢ç¼è¯çæ 头 |
| | | #include "framework.h" |
| | | |
| | | #endif //PCH_H |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | //{{NO_DEPENDENCIES}} |
| | | // Microsoft Visual C++ çæçå
嫿件ã |
| | | // ä¾ SGMeasurement.rc ä½¿ç¨ |
| | | // |
| | | #define IDM_ABOUTBOX 0x0010 |
| | | #define IDD_ABOUTBOX 100 |
| | | #define IDS_ABOUTBOX 101 |
| | | #define IDD_SGMEASUREMENT_DIALOG 102 |
| | | #define IDR_MAINFRAME 128 |
| | | #define IDI_ICON_RESTORE 130 |
| | | #define IDI_ICON_EXIT 131 |
| | | #define IDC_IPADDRESS 1000 |
| | | #define IDC_BUTTON_CONNECT 1001 |
| | | #define IDC_BUTTON_DISCONNECT 1002 |
| | | #define IDC_EDIT_OUT1 1003 |
| | | #define IDC_EDIT_OUT2 1004 |
| | | #define IDC_EDIT_OUT3 1005 |
| | | #define IDC_EDIT_OUT4 1006 |
| | | #define IDC_CHECK_USE_TRIGGER 1007 |
| | | #define IDC_EDIT_STORE_COUNT 1008 |
| | | #define IDC_COMBO_OUTPUT_PORT 1009 |
| | | #define IDC_BUTTON_START_STORE 1010 |
| | | #define IDC_BUTTON_STOP_STORE 1011 |
| | | #define IDC_BUTTON_CLEAR_STORE 1012 |
| | | #define IDC_BUTTON_RECEIVE_FROM_CTRL 1013 |
| | | #define IDC_BUTTON_SEND_TO_CTRL 1014 |
| | | #define IDC_RICHEDIT_LOG 1015 |
| | | #define IDC_BUTTON_CLEAR_LOG 1016 |
| | | #define IDC_EDIT_JUMP_THRESHOLD 1017 |
| | | #define IDC_EDIT_JUMP_WINDOW 1018 |
| | | #define IDC_EDIT_VALLEY_MARGIN 1019 |
| | | #define IDC_EDIT_MIN_GLASS_COUNT 1020 |
| | | #define IDC_EDIT_FIXED_COUNT 1021 |
| | | #define IDC_EDIT_MAX_DELTA 1022 |
| | | |
| | | // Next default values for new objects |
| | | // |
| | | #ifdef APSTUDIO_INVOKED |
| | | #ifndef APSTUDIO_READONLY_SYMBOLS |
| | | #define _APS_NEXT_RESOURCE_VALUE 132 |
| | | #define _APS_NEXT_COMMAND_VALUE 32771 |
| | | #define _APS_NEXT_CONTROL_VALUE 1023 |
| | | #define _APS_NEXT_SYMED_VALUE 101 |
| | | #endif |
| | | #endif |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | |
| | | // å
æ¬ SDKDDKVer.h å°å®ä¹å¯ç¨çæé«çæ¬ç Windows å¹³å°ã |
| | | |
| | | //妿è¦ä¸ºä»¥åç Windows å¹³å°çæåºç¨ç¨åºï¼è¯·å
æ¬ WinSDKVer.hï¼å¹¶ |
| | | // å° _WIN32_WINNT å®è®¾ç½®ä¸ºè¦æ¯æçå¹³å°ï¼ç¶ååå
æ¬ SDKDDKVer.hã |
| | | |
| | | #include <SDKDDKVer.h> |
| | |
| | | { |
| | | } |
| | | |
| | | void CPageRecipe::InitListCtrlHeaderForMaster() |
| | | { |
| | | m_listPPID.DeleteAllItems(); |
| | | while (m_listPPID.DeleteColumn(0)); |
| | | |
| | | CString strIniFile, strItem; |
| | | strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); |
| | | int width[12] = { 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 180 }; |
| | | for (int i = 0; i < 12; i++) { |
| | | strItem.Format(_T("Col_%d_Width"), i); |
| | | width[i] = GetPrivateProfileInt("PageRecipeListCtrl", strItem, width[i], strIniFile); |
| | | } |
| | | |
| | | m_listPPID.InsertColumn(0, _T(""), LVCFMT_RIGHT, 0); // éèå |
| | | m_listPPID.InsertColumn(1, _T("No."), LVCFMT_LEFT, width[1]); |
| | | m_listPPID.InsertColumn(2, _T("PPID"), LVCFMT_LEFT, width[2]); |
| | | m_listPPID.InsertColumn(3, _T("ç空çç¤"), LVCFMT_LEFT, width[6]); |
| | | m_listPPID.InsertColumn(4, _T("Bonder1"), LVCFMT_LEFT, width[4]); |
| | | m_listPPID.InsertColumn(5, _T("Bonder2"), LVCFMT_LEFT, width[5]); |
| | | m_listPPID.InsertColumn(6, _T("åçå·å´"), LVCFMT_LEFT, width[7]); |
| | | m_listPPID.InsertColumn(7, _T("ç²¾åº¦æ£æ¥"), LVCFMT_LEFT, width[8]); |
| | | m_listPPID.InsertColumn(8, _T("EFEM"), LVCFMT_LEFT, width[3]); |
| | | m_listPPID.InsertColumn(9, _T("å建æ¶é´"), LVCFMT_LEFT, width[9]); |
| | | m_listPPID.InsertColumn(10, _T("æè¿°"), LVCFMT_LEFT, width[10]); |
| | | } |
| | | |
| | | void CPageRecipe::InitListCtrlHeaderForDevice() |
| | | { |
| | | m_listPPID.DeleteAllItems(); |
| | | while (m_listPPID.DeleteColumn(0)); |
| | | |
| | | CString strIniFile, strItem; |
| | | strIniFile.Format(_T("%s\\configuration.ini"), (LPCTSTR)theApp.m_strAppDir); |
| | | int width[] = { 0, 60, 150, 150 }; |
| | | |
| | | for (int i = 0; i < 4; i++) { |
| | | strItem.Format(_T("Col_Device_%d_Width"), i); |
| | | width[i] = GetPrivateProfileInt(_T("PageRecipeListCtrl"), strItem, width[i], strIniFile); |
| | | } |
| | | |
| | | m_listPPID.InsertColumn(0, _T(""), LVCFMT_RIGHT, width[0]); |
| | | m_listPPID.InsertColumn(1, _T("No."), LVCFMT_CENTER, width[1]); |
| | | m_listPPID.InsertColumn(2, _T("Recipe ID"), LVCFMT_CENTER, width[2]); |
| | | m_listPPID.InsertColumn(3, _T("Recipe åç§°"), LVCFMT_CENTER, width[3]); |
| | | } |
| | | |
| | | void CPageRecipe::UpdateRecipeByPPID(const CString& strPPID) |
| | | { |
| | | if (strPPID.IsEmpty()) { |
| | |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | // 读åºå宽 |
| | | CString strIniFile, strItem; |
| | | strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); |
| | | int width[12] = { 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 180 }; |
| | | for (int i = 0; i < 12; i++) { |
| | | strItem.Format(_T("Col_%d_Width"), i); |
| | | width[i] = GetPrivateProfileInt("PageRecipeListCtrl", strItem, width[i], strIniFile); |
| | | } |
| | | |
| | | // TODO: 卿¤æ·»å é¢å¤çåå§å |
| | | CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_PPID); |
| | | DWORD dwStyle = pListCtrl->GetExtendedStyle(); |
| | |
| | | |
| | | HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1); |
| | | ListView_SetImageList(pListCtrl->GetSafeHwnd(), imageList, LVSIL_SMALL); |
| | | pListCtrl->InsertColumn(0, _T(""), LVCFMT_RIGHT, 0); // éèå |
| | | pListCtrl->InsertColumn(1, _T("No."), LVCFMT_LEFT, width[1]); |
| | | pListCtrl->InsertColumn(2, _T("PPID/Recipe ID"), LVCFMT_LEFT, width[2]); |
| | | pListCtrl->InsertColumn(3, _T("ç空çç¤"), LVCFMT_LEFT, width[6]); |
| | | pListCtrl->InsertColumn(4, _T("Bonder1"), LVCFMT_LEFT, width[4]); |
| | | pListCtrl->InsertColumn(5, _T("Bonder2"), LVCFMT_LEFT, width[5]); |
| | | pListCtrl->InsertColumn(6, _T("åçå·å´"), LVCFMT_LEFT, width[7]); |
| | | pListCtrl->InsertColumn(7, _T("ç²¾åº¦æ£æ¥"), LVCFMT_LEFT, width[8]); |
| | | pListCtrl->InsertColumn(8, _T("EFEM"), LVCFMT_LEFT, width[3]); |
| | | pListCtrl->InsertColumn(9, _T("å建æ¶é´"), LVCFMT_LEFT, width[9]); |
| | | pListCtrl->InsertColumn(10, _T("æè¿°"), LVCFMT_LEFT, width[10]); |
| | | pListCtrl->SetColumnWidth(10, LVSCW_AUTOSIZE_USEHEADER); |
| | | InitListCtrlHeaderForMaster(); |
| | | |
| | | // è·åæææ°æ® |
| | | auto vecData = RecipeManager::getInstance().getAllRecipes(); |
| | |
| | | |
| | | void CPageRecipe::OnDestroy() |
| | | { |
| | | CDialogEx::OnDestroy(); |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | int nSel = pComboBox->GetCurSel(); |
| | | SERVO::CEquipment* pEq = (SERVO::CEquipment*)pComboBox->GetItemDataPtr(nSel); |
| | | |
| | | // ä¿åå宽 |
| | | CString strIniFile, strItem, strTemp; |
| | | strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); |
| | | strIniFile.Format(_T("%s\\configuration.ini"), (LPCTSTR)theApp.m_strAppDir); |
| | | CHeaderCtrl* pHeader = m_listPPID.GetHeaderCtrl(); |
| | | |
| | | if (!pHeader || pHeader->GetItemCount() == 0) { |
| | | return; |
| | | } |
| | | |
| | | for (int i = 0; i < pHeader->GetItemCount(); i++) { |
| | | RECT rect; |
| | | pHeader->GetItemRect(i, &rect); |
| | | strItem.Format(_T("Col_%d_Width"), i); |
| | | if (!pHeader->GetItemRect(i, &rect)) { |
| | | continue; |
| | | } |
| | | |
| | | if (pEq == nullptr) { |
| | | strItem.Format(_T("Col_%d_Width"), i); |
| | | } |
| | | else { |
| | | strItem.Format(_T("Col_Device_%d_Width"), i); |
| | | } |
| | | |
| | | strTemp.Format(_T("%d"), rect.right - rect.left); |
| | | WritePrivateProfileString("PageRecipeListCtrl", strItem, strTemp, strIniFile); |
| | | WritePrivateProfileString(_T("PageRecipeListCtrl"), strItem, strTemp, strIniFile); |
| | | } |
| | | |
| | | CDialogEx::OnDestroy(); |
| | | } |
| | | |
| | | void CPageRecipe::OnShowWindow(BOOL bShow, UINT nStatus) |
| | |
| | | pComboBox->InsertString(i, |
| | | pEq[i] == nullptr ? _T("Master") : pEq[i]->getName().c_str()); |
| | | pComboBox->SetItemDataPtr(i, pEq[i]); |
| | | |
| | | if (pEq[i]) { |
| | | pEq[i]->masterRecipeListRequest(0, nullptr); |
| | | } |
| | | } |
| | | pComboBox->SetCurSel(0); |
| | | } |
| | |
| | | int nEqSel = pComboBox->GetCurSel(); |
| | | int selectedCount = ListView_GetSelectedCount(m_listPPID.GetSafeHwnd()); |
| | | |
| | | GetDlgItem(IDC_BUTTON_NEW)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_MODIFY)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE_ALL)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | |
| | | int nEqSel = pComboBox->GetCurSel(); |
| | | int selectedCount = ListView_GetSelectedCount(m_listPPID.GetSafeHwnd()); |
| | | |
| | | GetDlgItem(IDC_BUTTON_NEW)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_MODIFY)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE_ALL)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | |
| | | |
| | | SERVO::CEquipment* pEq = (SERVO::CEquipment*)pComboBox->GetItemDataPtr(nEqSel); |
| | | if (pEq == nullptr) { |
| | | InitListCtrlHeaderForMaster(); |
| | | auto vecData = RecipeManager::getInstance().getAllRecipes(); |
| | | FillDataToListCtrl(vecData); |
| | | } |
| | | else { |
| | | InitListCtrlHeaderForDevice(); |
| | | SERVO::CRecipeList* pRecipeList = pEq->getRecipeList(0); |
| | | FillRecipeListToListCtrl(pRecipeList); |
| | | } |
| | |
| | | #pragma once |
| | | #include "afxdialogex.h" |
| | | #include "RecipeManager.h" |
| | | #include "ListCtrlEx.h" |
| | | |
| | | // CPageRecipe å¯¹è¯æ¡ |
| | | |
| | |
| | | virtual ~CPageRecipe(); |
| | | |
| | | private: |
| | | void InitListCtrlHeaderForMaster(); |
| | | void InitListCtrlHeaderForDevice(); |
| | | void UpdateRecipeByPPID(const CString& strPPID); |
| | | void FillDataToListCtrl(const std::vector<RecipeInfo>& vecRecipe); |
| | | void FillRecipeListToListCtrl(SERVO::CRecipeList* pList); |
| | |
| | | DECLARE_MESSAGE_MAP() |
| | | |
| | | private: |
| | | CListCtrl m_listPPID; |
| | | CListCtrlEx m_listPPID; |
| | | }; |
| | |
| | | ); |
| | | )"; |
| | | |
| | | return m_pDB->executeQuery(createRecipeTable) |
| | | && m_pDB->executeQuery(createDeviceTable); |
| | | return m_pDB->executeQuery(createRecipeTable) && m_pDB->executeQuery(createDeviceTable); |
| | | } |
| | | |
| | | void RecipeManager::termRecipeTable() { |
| | |
| | | struct DeviceRecipe { |
| | | int nDeviceID; // 设å¤ID |
| | | int nRecipeID; // åé
æ¹ID |
| | | std::string strRecipeName; // åé
æ¹åç§° |
| | | std::string strDeviceName; // 设å¤åç§° |
| | | }; |
| | | |