C++用snap7库对PLC数据块进行读写

目录

必须读懂的PLC

进行读写

16进制HEX和10进制DEC转换

参考


必须读懂的PLC

  1. DBg_s7Client.DBRead(nDBNum, nVarAddr, nSize, byData);  //块号,变量地址,字节数,写入数据块指针/读取缓存数据块指针;

  2. 在下图中,对于变量cold,我们分别获得的信息是:nDBNum = 10(DB10), nVarAddr = 4 (偏移量), nSize = 2(6-4);

  3. byData是我们自己定义的字节类型的变量。

C++用snap7库对PLC数据块进行读写_第1张图片

进行读写

16进制HEX和10进制DEC转换

PLC存储的数据是16进制, C++程序是10进制,所以读或写都要做转换,下面是往PLC写入

void sendSpeed(double num)
{
	byte l_byData[4] = { 0 };
	float l_fSpeed = (float)num;

	l_byData[3] = *((byte*)&l_fSpeed + 0);
	l_byData[2] = *((byte*)&l_fSpeed + 1);
	l_byData[1] = *((byte*)&l_fSpeed + 2);
	l_byData[0] = *((byte*)&l_fSpeed + 3);
    //将数据写入PLC
	g_s7Client.DBWrite(30, 22, 4, &l_byData);

	//测试是否将数据写入到PLC中,所以对PLC进行读取
	byte l_byData1[20] = { 0 };
	float l_fSpeed1 = { 0 };
	if (g_s7Client.DBRead(30, 22, 4, &l_byData1) == 0)
	{
		*((byte*)&l_fSpeed1 + 0) = l_byData1[3];
		*((byte*)&l_fSpeed1 + 1) = l_byData1[2];
		*((byte*)&l_fSpeed1 + 2) = l_byData1[1];
		*((byte*)&l_fSpeed1 + 3) = l_byData1[0];
	}

    //写入txt文本
	ofstream outfile("SpeedTest.txt", ios::app);
	outfile << getTime() << "  " << l_fSpeed1 << "  " << endl;
	outfile.close();	
}

参考

  1. snap7-c++/MFC开发笔记_不约的小翔的博客-CSDN博客_mfc snap7
  2. 采用snap7实现对PLC1200的I、Q、M、DB区域进行读写_weixin_41320090的博客-CSDN博客_snap7读不到plc数据区
  3. 待补充

你可能感兴趣的:(C++,c++,PLC)