插件式架构OPC服务器程序开发 点击:614 | 回复:2



opcfan

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:62帖 | 58回
  • 年度积分:0
  • 历史总积分:667
  • 注册:2004年9月29日
发表于:2008-02-14 14:31:00
楼主
http://bbs.ifixonline.com/viewthread.php?tid=503&extra=page%3D1



opcfan

  • 精华:0帖
  • 求助:0帖
  • 帖子:62帖 | 58回
  • 年度积分:0
  • 历史总积分:667
  • 注册:2004年9月29日
发表于:2008-02-21 16:28:00
1楼
原来只支持Modbus TCP协议。
因为新增加了
Modbus RTU
Modbus Ascii
和Modbus MMF(映射内存文件,这个是我自己定义的一个规范,目的是让服务器能访问普通应用程序的数据,而不是控制设备的数据。在附件里也提供了一个实现此规范的工具DLL,也就是Vmemory32.dll。关于Vmemory32.dll的使用说明可以通过网址http://bbs.gongkong.com/detail.asp?id=439464查看,范例可以通过http://bbs.ifixonline.com/thread-513-1-1.html下载)

协议。所以原来的附件被我删除了,新网址是http://bbs.ifixonline.com/thread-513-1-1.html

opcfan

  • 精华:0帖
  • 求助:0帖
  • 帖子:62帖 | 58回
  • 年度积分:0
  • 历史总积分:667
  • 注册:2004年9月29日
发表于:2008-02-21 16:33:00
2楼
void CVMemoryAppDlg::OnBtnWrite() 
{
UpdateData(TRUE);
BOOL bIsOK = TRUE;
m_wOffset = m_wOffset-1;//偏移从1开始,而MMF是用0开始。
switch( m_nRegType )
{
case INPUT_COIL:
{
//VT_BOOL;
BOOL bSetValue = atoi(m_strWriteValue);
            bIsOK = SetVRAM(INPUT_COIL,m_wOffset,bSetValue);
break;
}
case OUTPUT_COIL:
{
// VT_BOOL;
BOOL bSetValue = atoi(m_strWriteValue);
            bIsOK = SetVRAM(OUTPUT_COIL,m_wOffset,bSetValue);
break;
}
case INPUT_REGISTER ://enum REGTYPE {INPUT_COIL, OUTPUT_COIL, INPUT_REGISTER, OUTPUT_REGISTER};
{
switch( m_dataType )//enum VARTYPE {VAR_INT, VAR_LONG, VAR_FLOAT, VAR_STRING,VAR_BIT,VAR_WORD};
{
default:
case VAR_INT://VT_I2:
{
int nSetValue = atoi(m_strWriteValue);
bIsOK = SetVRAM(INPUT_REGISTER, m_wOffset, nSetValue);
break;
}

case VAR_WORD://VT_UI2:
{
DWORD dwSetValue = atoi(m_strWriteValue);
bIsOK = SetVRAM(INPUT_REGISTER, m_wOffset, dwSetValue);
break;
}
case VAR_BIT://VT_BOOL:
{
BOOL bSetValue = atoi(m_strWriteValue);
bIsOK = SetVRAM(INPUT_REGISTER,m_wOffset,bSetValue);
break;
}

case VAR_STRING://VT_BSTR:
{
LPTSTR lpSetValue = (LPTSTR)(LPCTSTR)m_strWriteValue;
bIsOK = SetVRAM(INPUT_REGISTER,m_wOffset,lpSetValue);
break;
}

case VAR_LONG://VT_I4:
{
LONG lSetValue = atol(m_strWriteValue);
bIsOK = SetVRAM(INPUT_REGISTER, m_wOffset, lSetValue);
break;
}


case VAR_FLOAT://VT_R4:
{
                    float ftSetValue = (float)atof(m_strWriteValue);
bIsOK = SetVRAM(INPUT_REGISTER, m_wOffset, ftSetValue);
break;
}

}
}
case OUTPUT_REGISTER:
{
switch( m_dataType )//enum VARTYPE {VAR_INT, VAR_LONG, VAR_FLOAT, VAR_STRING,VAR_BIT,VAR_WORD};
{
default:
case VAR_INT://VT_I2:
{
int nSetValue = atoi(m_strWriteValue);
bIsOK = SetVRAM(OUTPUT_REGISTER, m_wOffset, nSetValue);
break;
}

case VAR_WORD://VT_UI2:
{
DWORD dwSetValue = atoi(m_strWriteValue);
bIsOK = SetVRAM(OUTPUT_REGISTER, m_wOffset, dwSetValue);
break;
}
case VAR_BIT://VT_BOOL:
{
BOOL bSetValue = atoi(m_strWriteValue);
bIsOK = SetVRAM(OUTPUT_REGISTER,m_wOffset,bSetValue);
break;
}

case VAR_STRING://VT_BSTR:
{
//LPTSTR lpSetValue = "hehe";

//字符串复制用 
LPTSTR lpSetValue =  "m_strWriteValue.GetBuffer(m_strWriteValue.GetLength())";
                    char test [500];
test[0] = 'Z';
test [1] = 'H';
/*
                     char   *pstr  = new char[m_strWriteValue.GetLength()] ; 
  for   (int  i=0; i<m_strWriteValue.GetLength(); i++)   
  {   
      *(pstr+i)=m_strWriteValue[i];   
  }
lpSetValue = pstr;*/
//LPTSTR lpSetValue = s;//(LPTSTR)(LPCTSTR)m_strWriteValue;
bIsOK = SetVRAM(OUTPUT_REGISTER,m_wOffset,test);
//m_strWriteValue.ReleaseBuffer();
break;
}

case VAR_LONG://VT_I4:
{
LONG lSetValue = atol(m_strWriteValue);
bIsOK = SetVRAM(OUTPUT_REGISTER, m_wOffset, lSetValue);
break;
}


case VAR_FLOAT://VT_R4:
{
                    float ftSetValue = (float)atof(m_strWriteValue);
bIsOK = SetVRAM(OUTPUT_REGISTER, m_wOffset, ftSetValue);
break;
}

}
}
break;
default: ASSERT( FALSE );
}

    if (!bIsOK)
    {
        AfxMessageBox(_T("写MMF错误"));
    }
    m_wOffset = m_wOffset+1;//还原
theApp.WriteProfileInt(_T("Tag"), _T("RegTypeIndex"), m_nRegType);
theApp.WriteProfileInt(_T("Tag"), _T("DataTypeIndex"), m_dataType);
UpdateData(FALSE);
}

热门招聘
相关主题

官方公众号

智造工程师