如题 ,在读取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各个参数的意思,和正确的用法。

解决方案 »

  1.   

    这里给出的声明和你的有点不一样:http://www.cnblogs.com/J0YANG/archive/2009/08/12/1544029.html
    不过没看到它的头文件,怎么都不好说。
      

  2.   

    对照下他给的英文手册: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再转一下
      

  3.   

    GetDBInt32Data中间的两个参数他又改为Byte作单位的,因此又做了个除2的操作
      

  4.   

    还有他那个GetDBInt32Data似乎只能读4字节的DBD(Int32),因为他的那个高低字节的转化对Int16似乎不适用,楼主先试试行否,不然需要自己改一下,写个可通用的
    建议是GetDBInt32Data专门用于读Int32,然后再写个GetDBInt16Data用于读Int16,这样也不需要DBByteAmount这个参数了
      

  5.   

       他既然返回来的就是Int32的整数,为什么还要转成数组,再转成int32?
      

  6.   

    因为很多单片机和现代计算机储存整型的字节顺序不一样,一个认为高位字节储存在靠近内存的高端,另一个则相反。
    例如单片机中一个Int32是0x12345678,如不转换,直接将字节序列进行拷贝,则计算机会将其看作是0x78563412
      

  7.   

    也就是说在内存中布局一样的4字节序列,如果把其首地址当作Int32类型的数据地址,字节序不相同的CPU会把它看做是数值不同的Int32