公司最近一个新设备用的NJ系列,研究几天发现这个系列和以往的大有不同,连PLC开发软件都是一个新的程序:sysmac studio,这是像VS看齐的节奏吗?

首先是地址,NJ系列内部不再有DM,CIO,WR等地址的概念了,取而代之的是“标签”。

数据类型,除了基本的int,real,bcd外,直接支持string类型了。

fins协议,这才是我最关心的,咨询欧姆龙的技术人员后得知,NJ是支持fins协议的,需要在全局变量里分配,把标签指定到某个地址即可,如果指定为DM地址要勾选保持。设置之后使用fins协议做上位机开发就和CJ/CS一样的了。

感觉NJ系列把PLC的编程和组态软件结合到一起了,组态是地址指定到标签,NJ正好相反。作PLC程序开发的同事说NJ系列的高端产品支持直连数据库的,这个真是相当强大啊,直接把上位机开发也集成了?

估计NJ系列是一个发展趋势,毕竟节点越多、控制端越多出问题的可能性越大,要是能在一个程序里完成梯形图、组态和上位机的开发我想不管是从效率还是可靠性应该是大有提升的,甚至感觉标签指定到地址就是为了兼容旧产品和FINS协议才存在的。

在OmronFinsTCP.Net中新增了一个读real型数据的方法,还是涉及到高低位转换的问题:

http://referencesource.microsoft.com 查看了BitConverter.ToInt16的源码如下

// Converts an array of bytes into a short.  
[System.Security.SecuritySafeCritical]  // auto-generated
public static unsafe short ToInt16(byte[] value, int startIndex) {
    if( value == null)  {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.value);
    }
    
    if ((uint) startIndex >= value.Length) {
        ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.startIndex, ExceptionResource.ArgumentOutOfRange_Index);
    }

    if (startIndex > value.Length -2) {
        ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
    }
    Contract.EndContractBlock();

    fixed( byte * pbyte = &value[startIndex]) {
        if( startIndex % 2 == 0) { // data is aligned 
            return *((short *) pbyte);
        }
        else {
            if( IsLittleEndian) { 
                return (short)((*pbyte) | (*(pbyte + 1) << 8)) ;
            }
            else {
                return (short)((*pbyte << 8) | (*(pbyte + 1)));                        
            }
        }
    }  
}

IsLittleEndian应该就是用来判断高低位字节序的,跟踪继续查看,BitConverter类的开头有对IsLittleEndian的定义:

// The BitConverter class contains methods for
// converting an array of bytes to one of the base data 
// types, as well as for converting a base data type to an
// array of bytes.
// Only statics, does not need to be marked with the serializable attribute
public static class BitConverter {
    // This field indicates the "endianess" of the architecture.
    // The value is set to true if the architecture is
    // little endian; false if it is big endian.
#if BIGENDIAN
    public static readonly bool IsLittleEndian /* = false */;
#else
    public static readonly bool IsLittleEndian = true;
#endif

这里用到了预处理命令,我觉得可以简单理解成BitConverter类的所有转换都是默认的低位在前,也就是little endian。
然后PLC等硬件设备一般是big endian的,所以在做上位机开发时一定要注意高低位的转换问题!

最后编辑:2020年06月26日 ©著作权归作者所有

发表评论