HP\李良庭
2025-07-08 868daf94f29ce1ffdd799a68c07bb668cd373bcd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 ACTUATOR_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// ACTUATOR_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef ACTUATOR_EXPORTS
#define ACTUATOR_API __declspec(dllexport)
#else
#define ACTUATOR_API __declspec(dllimport)
#endif
 
typedef enum
{
    //粮种准备命令代码(粮种已修改)
    READY_GRAIN = 0x01, 
 
    //返回准备完成
    READY_FINISH = 0x02,
 
    //检测启动命令
    DETECT_START = 0x03,
 
    //返回检测完毕
    DETECT_FINISH = 0x04,
 
    //设备水分仪复位命令
    DEVICE_WR_RESET = 0xFE,
 
    //返回水分仪故障代码
    DEVICE_WR_FAULT = 0xFF
}PLCWORD;
 
typedef enum
{
    //水分仪准备指令
    WR_READY = 0x01,
 
    //水分仪检测指令
    WR_DETECT = 0x02,
    
    //水分仪校验指令
    WR_VERIFY = 0x03,
 
    //水分仪复位指令
    WR_RESET = 0x04,
 
    //粮食变更指令
    WR_GOODS = 0x05,
 
    //上阀门开
    WR_VALV01 = 0x07,
    //上阀门关
    WR_VALV02 = 0x08,
    //下阀门开
    WR_VALV03 = 0x09,
    //下阀门关
    WR_VALV04 = 0x0A,
    //双阀门开
    WR_VALV05 = 0x0B,
    //双阀门关
    WR_VALV06 = 0x0C,
    //振动开
    WR_VIBRATE_01 = 0x0D,
    //振动关
    WR_VIBRATE_02 = 0x0E,
    
}WRWORD;
 
//创建初始化客户PLC设备句柄ctx
//strIp:   IP地址
//nPort:   网络端口
ACTUATOR_API void* __stdcall CreatePlcDevice(const char* strIp, int nPort);
 
//创建水分仪句柄ctx
//szSerialPort:   串口名
//baud:       波特率
//parity:     校验类型
//data_bit:   数据位
//stop_bit:   停止位
ACTUATOR_API void* __stdcall CreateWrDevice(const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit);
 
//连接客户设备或水分仪装置
//ctxDev : 设备句柄
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall ConnectDevice(void* ctxDev);
 
//获取状态或粮种更改信息
//ctxDev : 设备句柄
//nState :状态字,如下状态不会重复
//         0x01:  粮种已修改
//         0x03:  开始测试
//         0xFE:  复位命令,优先级最高
//         其他: 为写入状态
//nGoodType: 粮种编号 
//         0x01:  小麦, 
//         0x02:  水稻 
//         0x03:  黄豆 
//         0x04:  玉米
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall ReadState(void* ctxDev, unsigned short* nState, unsigned short* nGrainType);
 
//写回状态
//ctxDev : 设备句柄
//nState :状态字,如下状态不会重复
//         0x02:  准备已完成
//         0x04:  检测完成
//         0xFF:  水分仪故障
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall ResponseState(void* ctxDev, unsigned short nState);
 
//回传检测数据
//ctxDev : 设备句柄
//nDatas :数组,数据顺序如下
//         粮种编码
//         含水率,  取整 = 原值*100
//         容重比,  取整 = 原值*100
//nSize  : 数据个数
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall UploadData(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 3);
 
//下发命令信息
//ctxDev : 设备句柄
//nCmdType :命令字,如下描述
//         0x01:  粮种已修改
//         0x02:  开始测试
//         0x03:  校准命令,即为标定页面检测按钮命令,
//nGoodType: 粮种编号 
//         0x01:  小麦, 
//         0x02:  水稻 
//         0x03:  黄豆 
//         0x04:  玉米
//         当nCmdType 为0x02,0x03时,不用考虑粮种编号
// nResponseSeconds: 响应时间,以秒计算
// nResponseUSeconds: 响应时间,以微妙计算,若小于秒,全部用微妙表示。
//返回值:大于0 表示 设备有故障,故障码详见ReadFaultCode函数,有描述
//        小于0 表示 命令执行错误,错误可以通过 GetError提取处理。
//        等于0 表示 命令执行成功
ACTUATOR_API int __stdcall SendCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType = 0, unsigned int nResponseSeconds = 0, unsigned int nResponseUSeconds = 500000);
 
//下发参数
//ctxDev : 设备句柄
//nStartFreq :起始频率
//nStopFreq : 终止频率
//nStepFreq : 步长
//nDecayCode :衰减码
//nAscValid : ASC 内部/外部有效, 取值为 0:内部有效, 1:外部有效
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall WriteParams(void* ctxDev,   unsigned short nStartFreq, unsigned short nStopFreq,
                            unsigned short nStepFreq,  unsigned short nDecayCode, unsigned short nAscValid);
 
//读取检测信息
//ctxDev : 设备句柄
//nDatas :数组,数据顺序如下
//         电压值
//         重量
//         温度
//         湿度
// nSize : 读取4个寄存器
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall ReadDatas(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 4);
 
//读取固件版本
//ctxDev : 设备句柄
//nVersions :数组,数据顺序如下
//         硬件版本
//         软件版本
// nSize : 读取2个寄存器
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall ReadVersion(void* ctxDev, unsigned short* nVersions, unsigned short nSize = 1);
 
 
//读取扫频值,其实为电平值,
//ctxDev : 设备句柄
//nVcc :   电平值指针
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall ReadVcc(void* ctxDev, unsigned short* nVcc);
 
//读重量值,
//ctxDev : 设备句柄
//nWeight : 重量值
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall ReadWeight(void* ctxDev, unsigned short* nWeight);
 
//读取故障码,
//ctxDev : 设备句柄
//nFaultCode : 故障码
//             0 .......... 正常
//             1 .......... 上阀门关卡住
//             2 .......... 下阀门关卡住
//             4 .......... 上阀门开卡住
//             8 .......... 下阀门开卡住             
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall ReadFaultCode(void* ctxDev, unsigned short* nFaultCode);
 
//复位命令
//ctxDev : 设备句柄指针
//返回值:无, 
ACTUATOR_API int __stdcall ResetCommand(void* ctxDev);
 
//取错误字符串:
//ctxDev : 设备句柄指针
//返回值:无, 
//执行条件,在上面命令函数执行返回-1的时候调用。
ACTUATOR_API const char* __stdcall GetError(void* ctxDev);
 
//断开水分仪或客户设备的连接
//ctxDev : 设备句柄指针
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall Disconnect(void* ctxDev);
 
//销毁资源
//ctxDev : 设备句柄指针
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall DestroyDevice(void* ctxDev);
 
 
/***************************轮廓线回传函数**********************************
data:    数据以整数数组表示
nsize:   数据尺寸
**************************************************************************/
typedef void(__stdcall* MESSAGE_HANDLER)(unsigned short *data, int nsize);
 
/*
nSlavePort: 服务端口  比如 502
szDevPort: 串口  COM1
baud, parity, data_bit, stop_bit 参考上面函数
detectTimeout 检测超时时间
resetTimeout 服务超时时间
handler : 回调函数
*/
 
ACTUATOR_API int __stdcall StartTcpSlaveEx(void* waterDev, int nSlavePort, int detectTimeout = 60, int resetTimeout = 10, MESSAGE_HANDLER handler = NULL);
 
ACTUATOR_API int __stdcall StartTcpSlave(int nSlavePort, const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit, int, int detectTimeout = 60, int resetTimeout = 10, MESSAGE_HANDLER handler = NULL);
 
ACTUATOR_API int __stdcall StopTcpSlave();
 
//算法函数
//x 为测量值
//y 为实际值
//n 为拟合次数
//nSampleNumber 样本数量
//返回值:小于0 表示 错误, 
ACTUATOR_API int __stdcall Linearize(float x[], float y[], double Coefficient[], const int n = 2, const int nSampleNumber = 5);
ACTUATOR_API int __stdcall LinearizeX(double x[], double y[], double Coefficient[], const int nDegree = 3, const int nSampleNumber = 5);
ACTUATOR_API int __stdcall PolyNomialFit(double x[], double y[], double Coefficient[], const int nDegree = 3, const int nSampleNumber = 5);
 
//计算函数 
ACTUATOR_API double __stdcall CalcValue(unsigned short nDValue, double Coef0, double Coef1, double Coef2, double Coef3, double Coef4);