首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#与西门子s7-300通讯的有关问题

2012-06-16 
C#与西门子s7-300通讯的问题如题 ,在读取DB块里面的数据的时候,我用下面这个读没问题,返回一个byte数组:[D

C#与西门子s7-300通讯的问题
如题 ,在读取DB块里面的数据的时候,我用下面这个读没问题,返回一个byte数组:
 [DllImport("W95_s7.dll")] d_field_read
但是如果用下面这个读,读到的数据总是不对啊:
[DllImport("w95_s7.dll")] db_read
  网上给的方法是:
/// 从DB中读取数据
/// 
/// 指定DB块号
/// 指定读取的起始字序号,=0表示DBW0,=1表示DBW2
/// 指定读取的对象有多少个字
/// 返回值
[DllImport("w95_s7.dll")]
private extern static int db_read(int dbno, int dwno, ref int anzahl, ref long buffer);

  感觉这参数是不是介绍的不对?有没有用过的,给我详尽讲讲db_read各个参数的意思,和正确的用法。

[解决办法]
这里给出的声明和你的有点不一样:http://www.cnblogs.com/J0YANG/archive/2009/08/12/1544029.html
不过没看到它的头文件,怎么都不好说。
[解决办法]
对照下他给的英文手册:http://files.cnblogs.com/J0YANG/Prodave.pdf
确实有些小错漏
“1表示DBW2”应为“1表示DBW1”,参数dwno是Word偏移量
“2:DBW , 4:DBD”应为“1:DBW(Int16), 2:DBD(Int32)”,参数anzahl传入需要读和传出实际读的Word数目
他的GetDBInt32Data函数倒是没太大问题,你最好重点参考一下
这个GetDBInt32Data实现的重点在于:整数高位优先和低位优先的转换!经过转换的buffer数组在Intel计算机上才是“正常”的,如果最终需要int,把经过转换的buffer用BitConverter.ToInt再转一下

热点排行