// ActuatorDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include #include "../Actuator//Actuator.h" //系数 const double coef[5] = { 1,1,0.01,0,0 }; void ExeTest() { void* hPlcDev = CreateCustDevice("127.0.0.1", 1502); void* hWrDev = CreateDevice("COM3", 115200, 'N', 8, 1); unsigned short nState = 0; unsigned short nGrainType = 0; int ret = 0; if (hPlcDev) ret = ConnectDevice(hPlcDev); if (hWrDev) ret = ConnectDevice(hWrDev); char ch = 0; while ('c' != (ch = getchar())) //按 c 退出自动检测 { //读PLC状态字 ret = ReadState(hPlcDev, &nState, &nGrainType); if (ret <= 0) { printf("读取PLC状态字异常!\n"); } else if (nGrainType > 0 && nState > 0) { switch (nState) { case 0x01: //粮食品种修改了 { //向水分仪发粮种更改,启动准备 ret = SendCommands(hWrDev, 0x01, nGrainType); if (ret <= 0) { printf("粮食品种修改失败!水分仪故障!\n"); ret = WriteState(hPlcDev, 0xFF); } else { printf("粮食品种修改成功!准备就绪\n"); ret = WriteState(hPlcDev, 0x02); } } break; case 0x03: //开始测试 { ret = SendCommands(hWrDev, 0x02); if (ret <= 0) { printf("执行检测失败!\n"); ret = WriteState(hPlcDev, 0xFF); } else { unsigned short nDatas[10] = { 0 }; //从水分仪器读取数据 ret = ReadDatas(hWrDev, nDatas); printf("执行检测成功!\n"); ret = WriteState(hPlcDev, 0x04); //计算水分率 double v = coef[0] + coef[1] * nDatas[0] + coef[2] * nDatas[0] * nDatas[0] + coef[3] * nDatas[0] * nDatas[0] * nDatas[0] + coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0]; nDatas[0] = 0x01; // 粮食品种 nDatas[1] = v; // 21.30% //含水率 nDatas[2] = 5150; // 51.50; //容重比 ret = UploadData(hPlcDev, nDatas); } } break; case 0xFE: //复位命令 { } break; default: break; } } } if (hPlcDev) DestroyDevice(&hPlcDev); if (hWrDev) DestroyDevice(&hWrDev); } //手动写水分仪参数 void ExeWriteParam() { void* hWrDev = CreateDevice("COM3", 115200, 'N', 8, 1); unsigned short nState = 0; unsigned short nGrainType = 0; int ret = 0; if (hWrDev) ret = ConnectDevice(hWrDev); ret = WriteParams(hWrDev, 50, 100, 50, 12000, 1); if (ret <= 0) printf("下发参数失败!\n"); if (hWrDev) DestroyDevice(&hWrDev); } //手动检测 void ExeManTest() { void* hWrDev = CreateDevice("COM3", 115200, 'N', 8, 1); unsigned short nState = 0; unsigned short nGrainType = 0; int ret = 0; if (hWrDev) ret = ConnectDevice(hWrDev); ret = SendCommands(hWrDev, 0x01, 0x01); //下发确认 if (ret <= 0) printf("准备失败!\n"); else { ret = SendCommands(hWrDev, 0x02); //执行启动命令 if (ret <= 0) { printf("执行检测失败!\n"); } else { unsigned short nDatas[10] = { 0 }; //从水分仪器读取数据 ret = ReadDatas(hWrDev, nDatas); //计算水分率 double v = coef[0] + coef[1] * nDatas[0] + coef[2] * nDatas[0] * nDatas[0] + coef[3] * nDatas[0] * nDatas[0] * nDatas[0] + coef[4] * nDatas[0] * nDatas[0] * nDatas[0] * nDatas[0]; printf(" After Detection,"); printf(" %d %d %d %d", nDatas[0], nDatas[0], nDatas[0], nDatas[0]); printf(" Water Rate:%lf", v); printf(" \n"); } } if (hWrDev) DestroyDevice(&hWrDev); } // void ExeVerifyTest() { void* hWrDev = CreateDevice("COM3", 115200, 'N', 8, 1); unsigned short nState = 0; unsigned short nGrainType = 0; int ret = 0; if (hWrDev) ret = ConnectDevice(hWrDev); ret = SendCommands(hWrDev, 0x01, 0x01); //下发确认 if (ret <= 0) { printf("确认失败!\n"); } else { ret = SendCommands(hWrDev, 0x03); //执行启动命令 if (ret <= 0) { printf("校准执行失败!\n"); } else { unsigned short nVcc=0; //从水分仪器读取数据 ret = ReadScanFreq(hWrDev, &nVcc); printf(" After Detection,"); printf(" %d", nVcc); printf(" \n"); } } if (hWrDev) DestroyDevice(&hWrDev); } void TestLinearize() { int nSampeCount = 12; float x[]={1,2,3,4,5}; //电平值mV float y[]={2506,2200,1846,1440,1004}; //实测水分值 double coef[5] = { 0 }; int ret = Linearize(x, y, coef, 2, nSampeCount); if (ret > 0) { printf("Coef: %f, %f, %f, %f, %f\n", coef[0], coef[1], coef[2], coef[3], coef[4]); float v = 7.0f; printf("Input %lf, Cal Val:%lf\n", v, (coef[0] + coef[1] * v + coef[2] * v * v + coef[3] * v * v * v + coef[4] * v * v * v * v) ); } } int main() { std::cout << "Hello World!\n"; char ch = 0; while ('x' != ( ch = getchar() )) //按 x 退出程序 { switch (ch) { case 'a': //自动测试 ExeTest(); break; case 'p': //向水份仪下发参数 ExeWriteParam(); break; case 'd': //手动检测 ExeManTest(); break; case 'v': //校准 ExeVerifyTest(); break; case 'l': //拟合测试 TestLinearize(); break; default: break; } } } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件