MFC里面的初始化代码
/* 连接PLC */
shoudongDlg.PlcSDCtx=NULL; //将手动子对话框指针变量初始化
parameterDlg.PlcCSCtx=NULL;
PlcMctx=modbus_new_tcp("192.168.1.5",502); //创建一个TCP连接PLC的写参数类型容器
modbus_set_debug(PlcMctx,TRUE); //设置debug模式
shoudongDlg.PlcSDCtx=PlcMctx; //将主对话框的网络参数赋值子对话框指针变量
if (modbus_connect(PlcMctx)==-1||modbus_connect(PlcRMctx)==-1)
{
MessageBox(_T("请检查PLC网络设置"));
}
MDConnect=modbus_connect(PlcRMctx);
if(MDConnect==-1)
{
MessageBox(_T("连接失败"), _T(""), 0);
}
AfxBeginThread(PLCparReadThread,0,THREAD_PRIORITY_TIME_CRITICAL,0,0);
用定时器读取可以参数
这个是另一个对话框里面的PlcSDCtx我是在头文件赋了PlcMctx值个它
void CshoudongDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
#if 1
if(nIDEvent == 1)
{
uint16_t PlcDate[100]={0};
uint16_t PlcDate1[100]={0};
uint16_t PlcDate2[100]={0};
int ReadPlcData;
ReadPlcData=modbus_read_registers(PlcSDCtx,0, 100, PlcDate);//读取PLC0到100寄存器的值
Sleep(5);
ReadPlcData=modbus_read_registers(PlcSDCtx,30000, 100, PlcDate1);//读取PLC0到100寄存器的值
Sleep(5);
ReadPlcData=modbus_read_registers(PlcSDCtx,30101, 100, PlcDate2);//读取PLC0到100寄存器的值
Sleep(5);
Y1RuningWZ=PlcDate[1]<<16|PlcDate[0];//将DDT0的值赋给手动对话框的Y实时显示
Y2RuningWZ=PlcDate[7]<<16|PlcDate[6];
UpdateData(FALSE);
}
#endif
CDialogEx::OnTimer(nIDEvent);
}
用了这个线程来读PLC参数失败了,想请教是什么原因?
//读PLC参数线程
UINT CMFCPCBTestDlg::PLCparReadThread(LPVOID lParm)
{
modbus_t *ThreadPlcMctx;
CMFCPCBTestDlg * pDlg = (CMFCPCBTestDlg *)lParm;
ThreadPlcMctx=modbus_new_tcp("192.168.1.5",502);
while(WaitForSingleObject(ReadPlcThread,2)!=WAIT_OBJECT_0)
{
uint16_t PlcDate[100]={0};
uint16_t PlcDate1[100]={0};
uint16_t PlcDate2[100]={0};
int ReadPlcData;
ReadPlcData=modbus_read_registers(ThreadPlcMctx,0, 100, PlcDate);//读取PLC0到100寄存器的值
Sleep(5);
ReadPlcData=modbus_read_registers(ThreadPlcMctx,30000, 100, PlcDate1);//读取PLC30000到30100寄存器的值
Sleep(5);
ReadPlcData=modbus_read_registers(ThreadPlcMctx,30101, 100, PlcDate2);//读取PLC30100到30200寄存器的值
Sleep(5);
}
return 0;
}
把线程函数改成以下这样也不行,调试时候报内存访问冲突,请问是什么原因,是哪里出错引起了吗?
//读PLC参数线程
UINT CMFCPCBTestDlg::PLCparReadThread(LPVOID lParm)
{
CMFCPCBTestDlg * pDlg = (CMFCPCBTestDlg *)lParm;
while(WaitForSingleObject(ReadPlcThread,2)!=WAIT_OBJECT_0)
{
uint16_t PlcDate[100]={0};
uint16_t PlcDate1[100]={0};
uint16_t PlcDate2[100]={0};
int ReadPlcData;
ReadPlcData=modbus_read_registers(pDlg->PlcMctx,0, 100, PlcDate);//读取PLC0到100寄存器的值
Sleep(5);
ReadPlcData=modbus_read_registers(pDlg->PlcMctx,30000, 100, PlcDate1);//读取PLC30000到30100寄存器的值
Sleep(5);
ReadPlcData=modbus_read_registers(pDlg->PlcMctx,30101, 100, PlcDate2);//读取PLC30100到30200寄存器的值
Sleep(5);
}
return 0;
}
困扰多天,希望能得到指教,谢谢谢谢
你把PLCparReadThread定义改为static类型试试
经过请教,是我线程的创建不对,把开线程函数的第二个参数改this,改成这个AfxBeginThread(PLCparReadThread,this,THREAD_PRIORITY_TIME_CRITICAL,0,0);线程知识不过关,还需要加强