上位机编程:CP56Time2a格式精讲

Cp56Time2a介绍:

        Cp56Time2a是西门子PLC(可编程逻辑控制器)中用于时间数据传输的一种特殊格式,主要用于PCS7和基于TCP/IP的S7通信过程中。这种时间格式主要为了确保在不同的系统和设备之间进行精确的时间同步。

Cp56Time2a格式,如图:

Cp56Time2a格式的具体结构如下:

  1. 字节0-1:包含秒值的低16位。
  2. 字节2-3:包含秒值的高16位。
  3. 字节4-5:毫秒值,最高有效位(第16位)表示是否闰秒,其余15位表示毫秒。
  4. 字节6-7:日期信息,其中:
    • 低5位表示日(1-31)
    • 第6位表示月中的哪一天(星期几,0代表星期日,1代表星期一,以此类推)
    • 高2位表示月份(1-12)
  5. 字节8-9:年份的低16位。
  6. 字节10-11:年份的高16位。

总的来说,Cp56Time2a格式使用了12个字节来表示完整的日期和时间信息,包括秒、毫秒、日期(日、星期、月)、以及年份,并且考虑到了闰秒的情况,能够满足工业自动化领域对时间精度和一致性的要求。

Cp56Time2a编码:

  用java实现时间格式转换Cp56Time2a编码,如下图:

//Cp56Time2a编码
public static byte[] toBytes(Date date) {

        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        System.out.println("下发时间:"+sdf.format(date));

        byte[] result = new byte[7];

        Calendar aTime = Calendar.getInstance();
        aTime.setTime(date);
        aTime.add(Calendar.MONTH,1);
        int milliseconds = aTime.get(Calendar.SECOND);

        milliseconds=milliseconds*1000;
        result[0] = (byte) (milliseconds % 256);
        result[1] = (byte) (milliseconds / 256);
        result[2] = (byte) aTime.get(Calendar.MINUTE);
        result[3] = (byte) aTime.get(Calendar.HOUR_OF_DAY);
        result[4] = (byte) aTime.get(Calendar.DAY_OF_MONTH);
        result[5] = (byte) aTime.get(Calendar.MONTH);
        result[6] = (byte) (aTime.get(Calendar.YEAR) % 100);
        return result;
    }