串口数据处理 关于dcount107的回答

已锁定

ajmd

  • 帖子

    10
  • 精华

    0
  • 被关注

    0

论坛等级:新手

注册时间:2004-05-03

普通 普通 如何晋级?

串口数据处理 关于dcount107的回答

470

1

2014-12-25 11:19:13

展开查看
引用自找答案,问题ID:26862

我用WINCC读电参数测量仪送来的参数(串口),如何以十六进制显示?如何对各种参数分离,如何提取电压,电流,功率等?电参数测量仪的串行数据格式为:每个参数由5个字节组成,前4个字节表示尾数,后一个字节表示介码,数据格式采用科学记忆法:小数点在第一个BCD码之后.例:1.2345678×10的4次方,其浮点数为12345678.44 接受字节次序为:78,56,34,12,44哪位大虾子能给点指教啊;越详细越好!跪求!

提问者:小仙女


dcount107 回答道:

疑问1:1.2345678×10的4次方怎么会等于12345678.44呢?
  疑问2:是否为小数点位置固定,共传送5个字节,假设依次为&H78、&H56、&H34、&H12、&H44,最后根据这5个字节转换为12345678.44?

  对了,似乎WinCC不支持二进制接收(InputMode=1),也就是说不能使用BYTE数组来读取接收内容,但这在VB中是完全支持的,不知道你试的结果如何??
  dim ABuffer()
  ReDim ABuffer(MSComm1.InBufferCount)
  ABuffer = MSComm1.Input  '到这报错,提示类型不匹配

  因此你首先要解决的就是这个问题,一是改用VB与仪表通讯,再通过OLE向WinCC传递数值。二是使用字符方式接收,通过VDS.DLL组件(下载地址:http://support.microsoft.com/kb/250344/en-us)转换。

 补充:找答案的互动性不强,你这个问题放到论坛里边讨论比较好一些,不过那里的老大肯定会建议你用VB或做成控件再进行调用,^_^
 Sub OnComm(Byval Item)                   
 'On Error Resume Next                  
  HMIRuntime.Trace "OnComm...." & CStr(Now())& vbCrLf
  If item.CommEvent=2 Then
   Dim intInputLen
   intInputLen = item.InBufferCount
   If intInputLen<1 Then Exit Sub
   Dim ADS
   Set ADS = CreateObject("ADs.ArrayConvert")
   Dim CharV,OctV,HexV 
   CharV=Item.Input
   HMIRuntime.Trace "CharV is :" & CStr(CharV) & vbCrLf
   OctV=ads.CvStr2vOctetStr(CharV)
   HMIRuntime.Trace "OctV is :" & CStr(OctV) & vbCrLf
   HexV=ads.CvOctetStr2vHexStr(OctV)
   HMIRuntime.Trace "HexV is :" & CStr(HexV) & vbCrLf '#这是转换为16进制的字符串,应该与你发送的内容是一致的。
  End If
 End Sub
 比如你发送的5个字节内容为78 56 34 12 44,则HexV为7856341244,最后根据这个字符串转换为12345678.44。顺便帮你再写一个,不过需要你自己去完善:
 If Len(HexV)=10 Then
    Dim str(4),strFloat
    str(0)=Mid(HexV,7,2)
    str(1)=Mid(HexV,5,2)
    str(2)=Mid(HexV,3,2)
    str(3)=Mid(HexV,1,2)
    str(4)=Mid(HexV,9,2)
    strFloat=str(0)&str(1)&str(2)&str(3)&"."&str(4)
    HMIRuntime.Trace "strFloat is :" & CStr(strFloat) & vbCrLf
    Dim vFloat
    vFloat=CDbl(strFloat)
    HMIRuntime.Trace "vFloat is :" & CStr(vFloat) & vbCrLf
   End If
-------------------------
将RThreshold设为5试试。

还有2人在找答案上回答了该问题,查看全部>
最近在用WINCC的和外部设备的串行通讯,一直不得要领,无意间看了dcount107的回答,用了ADS函数,终于收到了接收的数据,但是问题是,数据的开头始终是3F04,我用串口调试助手接收的开头是CA0104,还有数据,我接收的仪表是2个字节为1个数据,如果数据在一个字节类,只要不超过00FF,都可以正常显示,超过FF,进位后,即使是0100,都不能正常显示,还会出现,只显示01后面2位00丢失的情况,请各位大神指教,到底问题出在哪里?
串口数据处理 关于dcount107的回答 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC WinCC / Panel

共有32576条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。