有谁用过ModbusM这个delphi控件吗?我会用它来读,不会写,其中有个ModbusM1.WriteValues,不知道怎么对它赋值。望知道的大虾麻烦告知偶一下,多谢!
解决方案 »
- 请问怎么改变Tpopupmenu的背景色?
- BitBlt 拷贝白条问题
- 利用父类指针如何调用继承类对象方法
- 急,请高手赐教!
- 挑战难题:如何将exe 或dll文件方便的转换成ocx也就是activeX文件??
- MessageBox(TeacherForm.Handle,'共找到ADOQuery1.RecordCount条记录!','提示',MB_OK or MB_APPLMODAL or MB_ICONINFORMATION)
- 请教Progressbar的问题?
- excel的内容能直接导入到delphi中去吗??
- fastreport 每页最后一行没有顶到头就折行到下一页了,如何解决?
- 急!!插入对象的问题。
- QQ2009 那种界面效果,大家觉得是怎样做出来的,或者是用什么技术做出来的
- delphi新手,急求“用户密码修改”窗体代码~
modbus协议还是比较简单的!
写 Register
iDeviceAddress 设备地址
iReference Reference号
iRegister Register号
intput 读取数据 返回值
0 写取正确
1 出错,查看modbus协议,对于FC10出错说明
2 出错,查看modbus协议,对于FC10出错说明
3 未知错误
小于0 网络错误
*/
int ModBusTCP::WriteRegister(BYTE iDeviceAddress,WORD iReference,WORD iRegister,RegisterValue *input)
{
unsigned char buf[80];
int bufcount;
int j;
for (j=0;j<80;j++) buf[j]=0;
bufcount=13+2*iRegister;
buf[0]=0;
buf[1]=0;
buf[2]=0;
buf[3]=0;
buf[4]=0;
buf[5]=7+2*iRegister;
buf[6]=iDeviceAddress;
buf[7]=0x10; buf[8]=(iReference>>8) & 0xFF;
buf[9]=iReference & 0xFF; buf[10]=(iRegister>>8) & 0xFF;
buf[11]=iRegister & 0xFF;
buf[12]=2*iRegister;
for (int i=0;i<iRegister;i++)
{
buf[13+i*2]=(input[i].Value>>8) & 0xFF;
buf[13+i*2+1]=input[i].Value & 0xFF;
}
int ret;
ret=send(m_Socket,(const char FAR*) buf,bufcount,0);
if (ret!=bufcount)
{
return -WSAGetLastError();
}
//对数据进行读取
char recvbuffer[80];
for (j=0;j<80;j++) recvbuffer[j]=0;
ret=recv(m_Socket,recvbuffer,80,0);
if(ret==0)
{
return -WSAGetLastError();
}
else if(recvbuffer[7]==0x90)
{
return recvbuffer[8];
}
else if (recvbuffer[7]==0x10)
{
return 0;
}
else
{
return 3;
}
}
写 Coil
iDeviceAddress 设备地址
iReference 开始Reference号
iBitCount 长度
iCoilVale 线圈状态
返回值
0 写取正确
1 出错,查看modbus协议,对于FC15出错说明
2 出错,查看modbus协议,对于FC15出错说明
3 未知错误
小于0 网络错误
*/
int ModBusTCP::WriteCoils(BYTE iDeviceAddress,WORD iRefernce,WORD iBitCount,WORD iCoilValue)
{
unsigned char buf[15];
int i;
for (i=0;i<14;i++) buf[i]=0;
buf[5]=0x09;
buf[6]=iDeviceAddress;
buf[7]=0x0F;
buf[8]=(iRefernce>>8) & 0xFF;
buf[9]=iRefernce & 0xFF;
buf[10]=(iBitCount>>8) & 0xFF;
buf[11]=iBitCount & 0xFF;
buf[12]=(iBitCount+7)/8;
if (buf[12]==0x01)
{
buf[13]=iCoilValue & 0xFF;
i=13;
}
else
{
buf[13]=(iCoilValue>>8)&0xFF;
buf[14]=(iCoilValue & 0xFF);
i=15;
}
int ret;
ret=send(m_Socket,(const char FAR*) buf,i,0);
if (ret!=i)
{
return -WSAGetLastError();
}
ret=0;
//对数据进行读取
char recvbuffer[12];
for (i=0;i<15;i++) recvbuffer[i]=0;
ret=recv(m_Socket,recvbuffer,15,0);
if(ret==0)
{
return -WSAGetLastError();
}
else if((WORD)recvbuffer[7]==0x8F)
{
return (WORD)recvbuffer[8];
}
else if (recvbuffer[7]==0x0F)
{
return 0;
}
else
{
return 3;
}
}
/*
写 Coil
iDeviceAddress 设备地址
iReference Reference号
iCoilVale 线圈状态:FF 线圈开 00 线圈关
返回值
0 写取正确
1 出错,查看modbus协议,对于FC05出错说明
2 出错,查看modbus协议,对于FC05出错说明
3 未知错误
小于0 网络错误
*/
int ModBusTCP::WriteCoil(BYTE iDeviceAddress,WORD iReference,BYTE iCoilVale)
{
unsigned char buf[12];
int i;
for (i=0;i<12;i++) buf[i]=0;
buf[5]=0x06;
buf[6]=iDeviceAddress;
buf[7]=0x05;
buf[8]=(iReference>>8) & 0xFF;
buf[9]=iReference & 0xFF;
buf[10]=iCoilVale;
buf[11]=00;
int ret;
ret=send(m_Socket,(const char FAR*) buf,12,0);
if (ret!=12)
{
return -WSAGetLastError();
}
//对数据进行读取
char recvbuffer[12];
for (i=0;i<15;i++) recvbuffer[i]=0;
ret=recv(m_Socket,recvbuffer,15,0);
if(ret==0)
{
return -WSAGetLastError();
}
else if((WORD)recvbuffer[7]==0x85)
{
return (WORD)recvbuffer[8];
}
else if (recvbuffer[7]==0x05)
{
return 0;
}
else
{
return 3;
}
}
data : TDataByte;
begin
SetLength(data,5);
data[0]:=1;
data[1]:=2;
data[2]:=3;
data[3]:=4;
data[4]:=5; ModBusM.WriteValues:=data;
ShowMessage(IntToStr(ModBusM.WriteValues[0]));
end;