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