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
// 下列 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
}WRWORD;
 
 
//创建初始化客户PLC设备句柄ctx
//strIp:   IP地址
//nPort:   网络端口
ACTUATOR_API void* CreatePlcDevice(const char* strIp, int nPort);
 
//创建水分仪句柄ctx
//szSerialPort:   串口名
//baud:       波特率
//parity:     校验类型
//data_bit:   数据位
//stop_bit:   停止位
ACTUATOR_API void* CreateWrDevice(const char* szSerialPort, int baud, char parity, int data_bit, int stop_bit);
 
 
//连接客户设备或水分仪装置
//ctxDev : 设备句柄
//返回值:小于0 表示 错误, 
ACTUATOR_API int ConnectDevice(void* ctxDev);
 
//获取状态或粮种更改信息
//ctxDev : 设备句柄
//nState :状态字,如下状态不会重复
//         0x01:  粮种已修改
//         0x03:  开始测试
//         0xFE:  复位命令,优先级最高
//         其他: 为写入状态
//nGoodType: 粮种编号 
//         0x01:  小麦, 
//         0x02:  水稻 
//         0x03:  黄豆 
//         0x04:  玉米
//返回值:小于0 表示 错误, 
ACTUATOR_API int ReadState(void* ctxDev, unsigned short* nState, unsigned short* nGrainType);
 
//写回状态
//ctxDev : 设备句柄
//nState :状态字,如下状态不会重复
//         0x02:  准备已完成
//         0x04:  检测完成
//         0xFF:  水分仪故障
//返回值:小于0 表示 错误, 
ACTUATOR_API int WriteState(void* ctxDev, unsigned short nState);
 
//回传检测数据
//ctxDev : 设备句柄
//nDatas :数组,数据顺序如下
//         粮种编码
//         含水率,  取整 = 原值*100
//         容重比,  取整 = 原值*100
//nSize  : 数据个数
//返回值:小于0 表示 错误, 
ACTUATOR_API int UploadData(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 3);
 
 
 
 
//下发命令信息
//ctxDev : 设备句柄
//nCmdType :命令字,如下描述
//         0x01:  粮种已修改
//         0x02:  开始测试
//         0x03:  校准命令,即为标定页面检测按钮命令,
//nGoodType: 粮种编号 
//         0x01:  小麦, 
//         0x02:  水稻 
//         0x03:  黄豆 
//         0x04:  玉米
//         当nCmdType 为0x02,0x03时,不用考虑粮种编号
//返回值:小于0 表示 错误, 
ACTUATOR_API int SendCommands(void* ctxDev, unsigned short nCmdType, unsigned short nGrainType = 0);
 
 
//下发参数
//ctxDev : 设备句柄
//nStartFreq :起始频率
//nStopFreq : 终止频率
//nStepFreq : 步长
//nDecayCode :衰减码
//nAscValid : ASC 内部/外部有效, 取值为 0:内部有效, 1:外部有效
//返回值:小于0 表示 错误, 
ACTUATOR_API int 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 ReadDatas(void* ctxDev, unsigned short* nDatas, unsigned short nSize = 4);
 
 
//读取扫频值,其实为电平值,
//ctxDev : 设备句柄
//nVcc   :电平值指针
//返回值:小于0 表示 错误, 
ACTUATOR_API int ReadVcc(void* ctxDev, unsigned short* nVcc);
 
 
//断开水分仪或客户设备的连接,并销毁资源
//ctxDev : 设备句柄指针
//返回值:小于0 表示 错误, 
ACTUATOR_API int DestroyDevice(void* ctxDev);
 
//算法函数
//x 为测量值
//y 为实际值
//n 为拟合次数
//nSampleNumber 样本数量
//返回值:小于0 表示 错误, 
ACTUATOR_API int Linearize(float x[], float y[], double Coefficient[], const int n = 2, const int nSampleNumber = 5);