// ActuatorDemo.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
|
//
|
|
#include <iostream>
|
#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 文件
|