From 868daf94f29ce1ffdd799a68c07bb668cd373bcd Mon Sep 17 00:00:00 2001
From: HP\李良庭 <liliangting@lanpucloud.cn:1111>
Date: 星期二, 08 七月 2025 11:49:03 +0800
Subject: [PATCH] 提交分辨率自适应版本V3.1.0.1500

---
 Actuator_src_2.0.3/Actuator/Actuator.cpp |  383 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 383 insertions(+), 0 deletions(-)

diff --git a/Actuator_src_2.0.3/Actuator/Actuator.cpp b/Actuator_src_2.0.3/Actuator/Actuator.cpp
new file mode 100644
index 0000000..ea2f86b
--- /dev/null
+++ b/Actuator_src_2.0.3/Actuator/Actuator.cpp
@@ -0,0 +1,383 @@
+锘�// Actuator.cpp : 瀹氫箟 DLL 鐨勫鍑哄嚱鏁般��
+//
+
+#include "pch.h"
+#include "framework.h"
+#include "Actuator.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../../libmodbus-3.1.10/src/modbus.h"
+
+int nGoodtype = 1;
+
+ACTUATOR_API void* __stdcall CreatePlcDevice(const char* strIp, int nPort)
+{
+    modbus_t* ctx = modbus_new_tcp(strIp, nPort);
+
+    modbus_set_slave(ctx, 1);
+    //modbus_set_debug(ctx, TRUE);
+    modbus_set_error_recovery(ctx, MODBUS_ERROR_RECOVERY_LINK);
+
+    return ctx;
+}
+
+//鍒涘缓姘村垎浠彞鏌�
+ACTUATOR_API void* __stdcall CreateWrDevice(const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit)
+{
+    modbus_t* ctx = modbus_new_rtu(szSerialPort, baud, parity, data_bit, stop_bit);
+    modbus_set_slave(ctx, 1);
+    //modbus_set_debug(ctx, TRUE);
+    modbus_set_error_recovery(ctx, MODBUS_ERROR_RECOVERY_LINK);
+
+    return ctx;
+}
+
+ACTUATOR_API int __stdcall Disconnect(void* ctxDev)
+{
+    if (NULL == ctxDev) return 1;
+    modbus_t* ctx = (modbus_t*)ctxDev;
+
+    if (NULL == ctx) return 1;
+
+    modbus_close(ctx);
+
+    return 1;
+}
+
+//鏂紑璁惧鐨勮繛鎺�
+ACTUATOR_API int __stdcall DestroyDevice(void* ctxDev)
+{
+    if (NULL == ctxDev) return 1;
+    modbus_t* ctx = (modbus_t*)ctxDev;
+
+    if (NULL == ctx) return 1;
+
+    modbus_free(ctx);
+
+    return 1;
+}
+
+ACTUATOR_API int __stdcall ConnectDevice(void* ctxDev)
+{
+    if (NULL == ctxDev) return -1;
+
+    modbus_t* ctx = (modbus_t*)ctxDev;
+
+    return modbus_connect(ctx);
+}
+
+//浠庡鎴稰LC鑾峰彇绮淇℃伅鍜岀姸鎬佷俊鎭�
+ACTUATOR_API int __stdcall ReadState(void* ctxDev, unsigned short* nState, unsigned short* nGrainType)
+{
+    if (NULL == ctxDev) return -1;
+
+    uint16_t tab_rp_registers[8] = { 0 };
+    int rc = modbus_read_registers((modbus_t*)ctxDev, 0, 3, tab_rp_registers);
+
+    if (rc > 0)
+    {
+        *nGrainType = tab_rp_registers[0]; //绮淇℃伅
+        switch (tab_rp_registers[0])
+        {//PLC 绮 ID 杞� 瑁呯疆 绮  ID
+        case 1: //PLC绋昏胺
+            *nGrainType = 2;
+            break;
+        case 2: //PLC鐜夌背
+            *nGrainType = 4;
+            break;
+        case 3: //PLC榛勮眴
+            *nGrainType = 3;
+            break;
+        case 4: //PLC灏忛害
+            *nGrainType = 1;
+            break;
+        }
+
+        *nState = tab_rp_registers[2]; //浜や簰瀵勫瓨鍣�
+    }
+    return rc;
+}
+
+//鍐欑姸鎬佺粰瀹㈡埛PLC
+ACTUATOR_API int __stdcall ResponseState(void* ctxDev, unsigned short nState)
+{
+    if (NULL == ctxDev) return -1;
+    unsigned short nStates[1] = { nState };
+
+    int rc = modbus_write_registers((modbus_t*)ctxDev, 2, 1, nStates);
+
+    return rc;
+}
+
+//涓婁紶鏁版嵁鍒板鎴稰LC
+ACTUATOR_API int __stdcall UploadData(void* ctxDev, unsigned short* nDatas, unsigned short nSize)
+{
+    if (NULL == ctxDev && nSize < 3) return -1;
+
+    switch(nDatas[0])
+    {//璁惧绮淇℃伅锛岃浆PLC涓ょ淇℃伅
+    case 1: //灏忛害
+        nDatas[0] = 4;
+        break;
+    case 2: //姘寸ɑ
+        nDatas[0] = 1;
+        break;
+    case 3: //榛勮眴
+        nDatas[0] = 3;
+        break;
+    case 4: //鐜夌背
+        nDatas[0] = 2;
+        break;
+    }
+
+    //2 鍜� 1浜ゆ崲銆�
+    unsigned short nVal = nDatas[1]; //姘村垎
+    nDatas[1] = nDatas[2];//姘村垎鍜屽閲嶄氦鎹�
+    nDatas[2] = nVal;
+
+    int rc = modbus_write_registers((modbus_t*)ctxDev, 1, 1, nDatas);
+    rc = modbus_write_registers((modbus_t*)ctxDev, 3, 2, &nDatas[1]);
+
+    return rc;
+}
+
+int ExeCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType = 0, unsigned int nResponseSeconds = 0, unsigned int nResponseUSeconds = 500000)
+{
+    if (NULL == ctxDev) return -1;
+
+    unsigned char cmdType = (unsigned char)nCmdType;
+    unsigned char grainType = (unsigned char)nGrainType;
+
+    uint16_t val = (cmdType << 8) | grainType;
+    //int val = (grainType << 8) | cmdType;
+
+    uint32_t nOldSeconds = 0;
+    uint32_t nOldUSeonds = 0;
+
+    //鑾峰彇鏃ф椂闂�
+    modbus_get_response_timeout((modbus_t*)ctxDev, &nOldSeconds, &nOldUSeonds);
+
+    //璁剧疆鏂版椂闂�
+    modbus_set_response_timeout((modbus_t*)ctxDev, nResponseSeconds, nResponseUSeconds);
+
+    int rc = modbus_write_register((modbus_t*)ctxDev, 0, val);
+
+    //鎭㈠鏃ф椂闂�
+    modbus_set_response_timeout((modbus_t*)ctxDev, nOldSeconds, nOldUSeonds);
+
+    return rc;
+}
+
+
+//鍚戞按鍒嗕华鍙戝懡浠�
+ACTUATOR_API int __stdcall SendCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType, unsigned int nResponseSeconds, unsigned int nResponseUSeconds)
+{
+    if (NULL == ctxDev) return -1;
+
+    int ret = 0;
+    //unsigned char cmdType = (unsigned char)nCmdType;
+    //unsigned char grainType = (unsigned char)nGrainType;
+
+    if (nGrainType > 0) //淇濇寔绮鍝佺淇℃伅
+        nGoodtype = nGrainType;
+
+    if (nCmdType == WR_VERIFY)
+    {//鏍″噯妫�娴嬫椂鍊欎笅鍙戠伯椋熷搧绉嶄俊鎭�
+        ret = ExeCommands(ctxDev, WR_GOODS, nGoodtype);
+        if (ret < 0)
+            printf("涓嬪彂绮澶辫触!\n");
+        else
+            ret = ExeCommands(ctxDev, WR_DETECT, nGrainType, nResponseSeconds, nResponseUSeconds);
+
+        return ret;
+    }
+    else
+        ret = ExeCommands(ctxDev, nCmdType, nGrainType, nResponseSeconds, nResponseUSeconds);
+
+    return ret;
+}
+
+//鍚戞按鍒嗕华鍐欏弬鏁�
+ACTUATOR_API int __stdcall WriteParams(void* ctxDev,
+               unsigned short nStartFreq,
+               unsigned short nStopFreq,
+               unsigned short nStepFreq,
+               unsigned short nDecayCode,
+               unsigned short nAscValid )
+{
+    if (NULL == ctxDev) return -1;
+    unsigned short nParams[10] = {nStartFreq,nStopFreq,nStepFreq,nDecayCode,nAscValid };
+
+    int rc = modbus_write_registers((modbus_t*)ctxDev, 5, 5, nParams);
+
+    return rc;
+}
+
+//浠庢按鍒嗕华鍐欏弬鏁� 锛堜粠0鍙峰瘎瀛樺櫒寮�濮嬶紝0鍙峰瘎瀛樺櫒涓虹數骞筹紝1鍙蜂负閲嶉噺锛�2鍙蜂负娓╁害锛�3鍙蜂负婀垮害 锛�
+ACTUATOR_API int __stdcall ReadDatas(void* ctxDev, unsigned short* nDatas, unsigned short nSize)
+{
+    if (NULL == ctxDev) return -1;
+
+    int rc = modbus_read_registers((modbus_t*)ctxDev, 0, nSize, nDatas);
+
+    return rc;
+}
+
+//璇绘牎鍑嗘暟鎹� 锛�10鍙峰瘎瀛樺櫒锛�
+ACTUATOR_API int __stdcall ReadVcc(void* ctxDev, unsigned short* nVcc)
+{
+    if (NULL == ctxDev) return -1;
+
+    //int rc = modbus_read_registers((modbus_t*)ctxDev, 10, 1, nVcc);
+    int rc = modbus_read_registers((modbus_t*)ctxDev, 0, 1, nVcc);
+
+    return rc;
+}
+
+//鍗曠嫭璇婚噸閲忔暟鎹� 锛�1鍙峰瘎瀛樺櫒锛�
+ACTUATOR_API int __stdcall ReadWeight(void* ctxDev, unsigned short* nWeight)
+{
+    if (NULL == ctxDev) return -1;
+
+    uint32_t nOldSeconds = 0;
+    uint32_t nOldUSeonds = 0;
+
+    //鑾峰彇鏃ф椂闂�
+    modbus_get_response_timeout((modbus_t*)ctxDev, &nOldSeconds, &nOldUSeonds);
+
+    //璁剧疆鏂版椂闂�
+    modbus_set_response_timeout((modbus_t*)ctxDev, 10, 0);
+
+    int rc = modbus_read_registers((modbus_t*)ctxDev, 1, 1, nWeight);
+
+    //鎭㈠鏃ф椂闂�
+    modbus_set_response_timeout((modbus_t*)ctxDev, nOldSeconds, nOldUSeonds);
+
+    return rc;
+}
+
+
+ACTUATOR_API int __stdcall Linearize(float x[], float y[], double Coefficient[], const int n, const int nSampleNumber)
+{
+    float A[2] = { 0 }, B[2] = { 0 }, C;
+    //float Y[3][nSampleNumber] = { 0 };
+    float* yAlt = new float[3 * nSampleNumber];
+    float (*Y)[3] = (float (*)[3])yAlt;
+    float temp;
+    //float Co[3][n + 1] = { 0 };
+    float* coAlt = new float[3 * (n + 1)];
+    float (*Co)[3] = (float(*)[3])coAlt;
+
+    memset(yAlt, 0, sizeof(float) * (3 * nSampleNumber));
+    memset(coAlt, 0, sizeof(float) * (3 * (n + 1)));
+
+    unsigned char i, j;
+    // float x[]={0,1,2,3,4,5,6,7,8,9,10,11};
+    // float y[]={2506,2200,1846,1440,1004,548,79,-387,-847,-1288,-1700,-2066};
+    int ret = 1;
+    try
+    {
+        C = 0;
+        for (i = 0; i < nSampleNumber; i++)
+        {
+            Y[0][i] = 1;
+            C += y[i];
+            A[0] += x[i];
+        }
+        A[0] /= nSampleNumber;
+        C /= nSampleNumber;
+        Co[0][0] = 1;
+        Coefficient[0] = C;
+        C = 0;
+        for (i = 0; i < nSampleNumber; i++)
+        {
+            Y[1][i] = x[i] - A[0];
+            C += Y[1][i] * y[i];
+            B[0] += Y[1][i] * Y[1][i];
+            A[1] += x[i] * Y[1][i] * Y[1][i];
+        }
+        A[1] /= B[0];
+        C /= B[0];
+        B[0] /= nSampleNumber;
+        Co[1][0] = -1 * A[0];
+        Co[1][1] = 1;
+        A[0] = A[1];
+        Coefficient[0] += Co[1][0] * C;
+        Coefficient[1] = Co[1][1] * C;
+        for (i = 2; i <= n; i++)
+        {
+            temp = 0;
+            C = 0;
+            A[1] = 0;
+            B[1] = 0;
+            for (j = 0; j < nSampleNumber; j++)
+            {
+                Y[2][j] = Y[1][j];
+                Y[2][j] *= (x[j] - A[0]);
+                Y[2][j] -= (B[0] * Y[0][j]);
+                C += Y[2][j] * y[j];
+                temp += Y[2][j] * Y[2][j];
+                if (i < n)
+                {
+                    A[1] += x[j] * Y[2][j] * Y[2][j];
+                    B[1] += Y[1][j] * Y[1][j];
+                }
+                Y[0][j] = Y[1][j];
+                Y[1][j] = Y[2][j];
+            }
+            C /= temp;
+            for (j = i; j >= 1; j--)
+            {
+                Co[2][j] = Co[1][j - 1];
+            }
+            for (j = 0; j < i; j++)
+            {
+                Co[2][j] -= Co[1][j] * A[0];
+            }
+            for (j = 0; j <= i - 2; j++)
+            {
+                Co[0][j] *= B[0];
+                Co[2][j] -= Co[0][j];
+            }
+            for (j = 0; j <= i; j++)
+            {
+                Co[0][j] = Co[1][j];
+                Co[1][j] = Co[2][j];
+                Co[2][j] = 0;
+            }
+            for (j = 0; j <= i; j++)
+            {
+                Coefficient[j] += C * Co[1][j];
+            }
+            if (i < n)
+            {
+                B[0] = temp / B[1];
+                A[0] = A[1] / temp;
+            }
+        }
+    }
+    catch(...)
+    {
+        ret = -1;
+    }
+
+    if(yAlt) delete yAlt;
+    if(coAlt) delete coAlt;
+
+    return ret;
+}
+
+ACTUATOR_API double __stdcall CalcValue(unsigned short nDValue, double Coef0, double Coef1, double Coef2, double Coef3, double Coef4)
+{
+    return (
+        Coef0 + 
+        Coef1 * nDValue + 
+        Coef2 * nDValue * nDValue +
+        Coef3 * nDValue * nDValue * nDValue +
+        Coef4 * nDValue * nDValue * nDValue * nDValue
+        );
+}
\ No newline at end of file

--
Gitblit v1.9.3