有谁用过ModbusM这个delphi控件吗?我会用它来读,不会写,其中有个ModbusM1.WriteValues,不知道怎么对它赋值。望知道的大虾麻烦告知偶一下,多谢!

解决方案 »

  1.   

    为何要用控件呢?
    modbus协议还是比较简单的!
      

  2.   

    /*
     写 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;
    }
    }
      

  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;
    }
    }
      

  4.   

    WriteValues是一个私有的byte数组,不能直接在外界调用,修改源代码,申明为公共的,把它放到属性栏里,重新编译安装试试看。
      

  5.   

    刚才说的,没有修改的权限,看了下代码已经是公共型了。WriteValues为动态数组,应该先设置长度,试了下,这样赋值可以。var
      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;