CR1000带有十六进制字符的轮询和响应 _Campbellsci论坛问答

大家好,
我有一个倾斜仪,它使用十六进制字符进行轮询和后续响应。我在试图找出如何用正确的“”轮询传感器时遇到了一些问题;字符串“;从CR1000输出。传感器有三个轴,我对轴2感兴趣,它是7F 01 83的轮询命令。7F是传感器地址,01是以字节为单位的消息长度,减去地址和长度,83是用于发送轴2数据的命令。我可以将传感器连接到我的电脑,使用ProComm中的元密钥编程,我可以发送十六进制命令并查看响应,这样我就知道传感器工作正常。我试过很多不同的“;字符串”;到目前为止无法获得正确的组合。任何帮助都将不胜感激。
谢谢
岛民

CR1000带有十六进制字符的轮询和响应
_Campbellsci论坛问答

新对话如下:

嗨,岛,

我一直在做一个类似的项目。我需要通过CR1000调整Omega过程控制器的设定点值。该控制器还使用十六进制字符串发送和接收数据。我设法编写了一个可以读写设定点的软件,尽管我看到了一些需要解决的编码问题。

我使用MD485多点连接到控制器隔离的RS485接口。

如果你想看看我疯狂的方法,这里有一个控制器通信手册的链接。http://www.omega.com/manuals/manualpdf/M3397.pdf

请记住,这段代码只是一个开始,它需要更多的工作,但确实可以读取和写入设置点,到目前为止是一个良好的开始。

史蒂夫

‘Omega控制器至MD485接线
'Rx至MD485端子B
'发送至MD485端子A
'Rtn到MD485接地。
'
公共DecString
公开表达
公用SetPoint_psig为长
Public SetPressure_Flag As Long(公用设置压力滞后为长)如果设置了标志,则设置压力。
Public ReadSetPoint_Flag As Long(公共读取设置点延迟为长时间)如果设置了Flag(标记),则读取当前设置点。
公共错误_延迟为长
'
公共十六进制字符串为字符串*10
公共输出字符串为字符串*10
公共InString作为字符串*10
公共组合为字符串*10
'
Public SetInjPres_psig As Long(公共设置InjPres_prig为长值)用于设置喷射压力。

常数CR=CHR(13)

'==================================================================================================================
子读数设定值
串行冲洗(ComSDC8)
InString=“";
输出字符串=“*01R01“+铬
串行输出(ComSDC8,OutString,“”,0100)
串行输入(InString,ComSDC810,13100)
DecString=十六进制到十二进制(InString)
SetPoint_psig=十进制字符串-1048576
EndSub公司
'===读取和写入Omega控制器设置点的子程序=====================================================
子写入设定点
串行冲洗(ComSDC8)
组合=“*01W01“+六进制字符串+CR
串行输出(ComSDC8,组合,“”,0100)
延迟(1100毫秒)
组合=“*01Z02“+铬
SerialOut(ComSDC8,Combined,“”,0100)'发出控制器复位命令。
EndSub公司
'===括号允许的范围为100到1500+======================================================================
子转换器InjPres
错误_滞后=0
如果SetInjPres_psig>;99与设置InjPres_psig<;1501然后
表达式=1048576+设置InjPres_psig
HexString=十六进制(表达式)
其他的
错误_滞后=1
结束如果
EndSub公司
'==================================================================================================================
'==================================================================================================================
开始进度
SerialOpen(ComSDC8,-9600,0100,50)'为MD485打开通信端口>>;欧米茄控制器。
扫描(5,秒,0,0)'每5秒测量一次。
'--检查读写标志-----------------------------------------------------------------------------------
如果设置压力滞后=1,则
转换器输入压力
如果Error_Flag=0,则
写入设定点
读取设定值
结束如果
设定压力滞后=0
结束如果

如果ReadSetPoint_Flag=1,则
读取设定值:ReadSetPoint_Flag=0
结束如果

下一次扫描'转到扫描。
'------------------------------------------------------------------------------------------------------------------
EndProg'结束程序。

新对话如下:

大地测量,
谢谢你的回复。浏览你的课程给了我一些解决困境的好主意和理解。
我会在解决方案生效后发布。
Rgds,
岛民

PS,我终于可以让传感器做出响应了,我的轮询字符串是这样的:
轮询$=CHR(127)+CHR(001)+CHR(131)

*最后更新者:IslandMan于2009年8月31日凌晨4:40*

新对话如下:

岛民,

我以前遇到过一种情况,串行传感器在传输数据之前需要CR/LF。在这个特定的例子中,我只有在如下声明时才成功发送了CR/LF:

公共CRLF长
CRLF=和h00000D0A


我很想知道以下传感器是否适用于您:

公用轮询轴2为长
PollAxes2=&h007F0183

山姆

新对话如下:

嗨,Sam,

我尝试了你的建议,但传感器没有响应。
我使用过:
PollAxes2=&h007F0183
还尝试过:
轮询轴2=&h7F0183

我正在通过SDM-SIO1进行民意调查,不确定这是否有什么不同,我在OS17,只是为了记录在案。

当做
戴夫

新对话如下:

从记录器发送二进制数据需要一些思考。如果您直接发送值,而没有隐式或显式地将它们转换为字符串,则会发送原始二进制值。在长的情况下,无论长被分配给什么,它都将是4个二进制字节。在上面的例子中,这意味着一些空字符将在您想要的二进制数据之前发送,有些传感器会忽略,而另一些则不会。

您还需要注意,如果在串行输出命令中将变量附加在一起,记录器将在输出数据之前将大多数变量转换为字符串,例如,LongV+stringV将导致长变量(LongV)在字符串V之前传输之前转换为数字的ASCII表示。

如果需要使用&或+运算符,发送几个字符的最受控制的方法是使用chr函数将一系列字符附加在一起。你也可以声明一个常数,这有助于理解,例如。

CONST CRLF=chr(13)+chr(10)

然后可以将其附加到其他数据(例如字符串V+CRLF)或仅用于发送后面跟着LF的CR。

不幸的是,一些用户在尝试使用+运算符在serialout指令中构建字符串时,可能发现早期记录器操作系统存在一些问题。这是一个错误,至少在两个操作系统之前就被修复了,所以你应该发现现在一切都正常了。

新对话如下:

事实证明,发送正确的民意调查是我遇到的最小问题。尝试用SDM-SIO4读取十六进制答案已被证明是一个真正的拔毛器。我仍然没有把它整理好。无论如何,谢谢你的投入,安德鲁。
岛民

进一步信息:

给定7F 01 83的Poll,示例响应将是7F 01 83FF FF 4E FF 27,其中FF FF 4EFF是数据,27是校验和。2’补全,除以1000,等于-45.313。

我试过SerialIn,SerialInBlock似乎根本不起作用。SerialInRecord试图捕获7F(127),然后将剩余的字符转储到字符串中,这种方法偶尔会奏效。我使用的是SDM-SIO1,因为这个传感器是另一个具有“;RS232”;实际上不是的输出,TX Data需要处于ON状态才能使单元正常工作。
最后是一个问题:
有人知道这个设备使用十六进制输入是否有问题吗?

谢谢
戴夫

*最后更新者:IslandMan于2009年9月9日上午10:09*

新对话如下:

SDM-SIO1(不是你文章中提到的SIO4)相对来说是哑的,它将所有数据传递到记录器,在那里它以与记录器上的任何其他串行端口相同的方式进行处理,所以这不太可能是一个问题。

除了检查缓冲区大小是否足够大之外,我还想到了几件事:

对于serialinrecord,您的校验和或数据是否包括您试图用作查找数据字符串开头的触发器的7F值?如果是这样,您会因为明显的原因遇到麻烦。

由于您能够轮询传感器,因此在发出轮询并等待数据将所有数据返回到一个字符串中之后,您应该能够使用Serialinblock,然后可以对其进行分解。

然后,如果数据值可能包括Null(chr(0))字符,则您需要小心处理该字符串,原因在本论坛的其他线程中讨论过。


顺便说一句,当你说这是十六进制数据时,你的意思是数据是以ASCII十六进制表示的数据传输的(仅使用字符0-9和A-F),还是你使用十六进制只是作为向我们显示8位二进制数据的方法。我不确定?

新对话如下:

你好,安德鲁,
很抱歉SIO1和SIO4混淆了。我的缓冲区足够大,我已经确定了。我现在明白了您所说的serialinrecord在触发器变量的多个输入方面存在问题的意思。我会再给Serialinblock注射一次,但我似乎无法让它发挥作用。
是的,它是十六进制数据,0-9和A-F。
谢谢
戴夫

分享到:

原文链接:,转发请注明来源!
海洋仪器网 仪器使用 CR1000带有十六进制字符的轮询和响应 _Campbellsci论坛问答
「CR1000带有十六进制字符的轮询和响应 _Campbellsci论坛问答」评论列表

发表评论