// 下列 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);