通过modbus4j读写字符串到PLC

本项目使用modbus4j-3.0.3.jar实现于PLC通讯。
实现与PLC连接并完成读写基本数据类型通讯测试不再赘述,本人参考了云逸的博客https://www.cnblogs.com/ioufev/p/10831289.html
直接进入主题,读写字符串
写入字符串
/**
     * 测试程序
     *
     * @param slaveId
     * @param offset
     * @param dataType
     * @param value
     * @return
     * @throws ModbusTransportException
     * @throws ErrorResponseException
     * @throws ModbusInitException
     */
    public static boolean writeStrToPlc(int slaveId, int startOffset, String value) throws ModbusTransportException, ErrorResponseException, ModbusInitException {
        // 获取master
        ModbusMaster tcpMaster = getMaster();
        short[] sdata = SetString(value);
        // 创建请求对象
        WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, sdata);
        // 发送请求并获取响应对象
        ModbusResponse response = tcpMaster.send(request);
        if (response.isException()) {
//            log.error(response.getExceptionMessage());
            return false;
        } else {
            return true;
        }
    }
工具类方法 setString()主要进行了一下数据类型转换
public static short[] SetString(String value) {
        byte[] bytesTemp = value.getBytes(StandardCharsets.UTF_8);
        byte[] bytes;
        if (bytesTemp.length % 2 > 0) {
            bytes = Arrays.copyOf(bytesTemp, bytesTemp.length + 1);
        } else {
            bytes = bytesTemp;
        }
        return bytesToShort(bytes);
    }

    /**
     * Byte数组转short数组
     *
     * @param bytes
     * @return
     */
    public static short[] bytesToShort(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        short[] shorts = new short[bytes.length / 2];
        ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(shorts);
        return shorts;

    }

读取字符串
/**
     *
     * @param slaveId
     * @param offset
     * @param dataType
     * @return
     * @throws ModbusTransportException
     * @throws ErrorResponseException
     * @throws ModbusInitException
     */
    public static String readHoldingRegisters(int slaveId, int offset, int dataType, int num)
            throws ModbusTransportException, ErrorResponseException, ModbusInitException {
        // 03 Holding Register类型数据读取
        short[] data = new short[num];
        for (int i = 0; i < num; i++) {
            data[i] = readHoldingRegister(slaveId, offset + i, dataType).shortValue();
        }
        try {
            return GetString(data, 0, num);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(Modbus4jReadUtils.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

工具类方法getString()  类型转换
        /**
         * 
         * @param src
         * @param start
         * @param len
         * @return 
         */
        public static String GetString(short[] src, int start, int len) throws UnsupportedEncodingException
        {
            short[] temp = new short[len];
            for (int i = 0; i < len; i++)
            {
                temp[i] = src[i + start];
            }
            byte[] bytesTemp = shorts2Bytes(temp);
            for (int i = 0; i < bytesTemp.length; i++) {
                byte b = bytesTemp[i];
            }
            String str = new String(bytesTemp, "UTF-8");
            return str;
        }
        /**
         * 
         * @param data
         * @return 
         */
        public static byte [] shorts2Bytes(short [] data){
            byte[] byteValue = new byte[data.length * 2];
            for (int i = 0; i < data.length; i++) {
                byteValue[i * 2] = (byte) (data[i] & 0xff);
                byteValue[i * 2 + 1] = (byte) ((data[i] & 0xff00) >> 8);
            }
            return byteValue;
        }
PLC本身并不直接支持字符串类型数据。这里只能将字符串进行转换后进行存储,读的时候也是一样,通过读入一段连续的寄存器地址数据,再转成字符串
 

<think>好的,我现在需要解决用户的问题,关于如何实现三菱FX5U PLC与RFID设备通过Modbus TCP协议进行通信。首先,用户提到了Modbus TCP和FX5U,我需要回忆相关的知识,并结合提供的引用内容。 首先,根据引用[1],FX5U支持Modbus TCP案例,使用的阅器是FR系列超高频PoE版。引用[2]则详细描述了Modbus RTU的配置,但用户需要的是Modbus TCP,所以可能需要参考类似的结构,但协议不同。 接下来,我需要考虑Modbus TCP和RTU的区别。Modbus TCP基于以太网,使用TCP/IP协议,而RTU是串行通信。因此,硬件连接部分,FX5U可能需要以太网模块,比如内置的以太网端口或者扩展模块。用户的问题是关于TCP的,所以应该使用FX5U的内置以太网口,或者确认是否支持。 然后,步骤方面,应该包括硬件连接、PLC参数设置、编写通信程序、RFID设备配置、测试等。例如,FX5U的GX Works3中需要设置IP地址,配置Modbus TCP主站功能,可能使用特定的指令如MC协议或ADPRW指令。但根据引用[2],Modbus RTU使用的是ADPRW指令,但TCP可能需要不同的指令或配置方式,需要查阅FX5U的Modbus TCP相关资料。 另外,用户可能需要示例程序的结构,比如如何发送取命令到RFID设备。例如,使用SLMP(Seamless Message Protocol)或者内置的Modbus TCP功能块。需要确认FX5U支持哪种方式。可能需要在GX Works3中配置通信参数,如IP地址、端口号(默认502),以及从站地址(RFID设备的站号)。 可能还需要考虑数据寄存器的分配,如何解析从RFID设备返回的数据,比如标签号存储在哪个寄存器中,如何取。例如,使用MELSEC指令中的TCP通信函数,或者使用Modbus功能码如03(取保持寄存器)来取数据。 此外,确保RFID设备的Modbus TCP配置正确,比如IP地址与PLC在同一子网,Modbus寄存器映射正确。例如,FR系列设备的寄存器地址可能对应不同的功能,如标签取存储在特定寄存器中,需要参考其文档。 测试阶段,可能需要使用网络调试工具或PLC的诊断功能来监控通信状态,查看是否有错误代码,逐步排查连接问题或配置错误。 总结步骤大致如下: 1. 硬件连接:FX5U通过以太网连接到RFID设备。 2. PLC参数设置:配置FX5U的IP地址和Modbus TCP主站。 3. 编写PLC程序:使用适当指令发送Modbus请求。 4. 配置RFID设备:设置Modbus TCP从站参数。 5. 测试与调试:验证数据读写,处理异常。 需要确保每个步骤的细节准确,例如GX Works3中的具体配置位置,使用的指令示例,以及可能的常见问题解决方法。同时,引用提供的案例中的信息,如引用[1]提到的FR系列PoE版,可能需要用户确认设备型号是否支持Modbus TCP,并参考其通信手册。</think>### 三菱FX5U PLC与RFID设备通过Modbus TCP通信的配置步骤 #### 1. **硬件连接** - **FX5U PLC**:使用内置以太网端口或扩展以太网模块(如FX5-ENET/IP)连接至同一局域网的交换机。 - **RFID读写器**:确保支持Modbus TCP协议(如FR系列超高频PoE版),通过网线接入同一网络[^1]。 - **网络配置**:为PLC和RFID设备分配静态IP地址(例如PLC:`192.168.1.10`,RFID:`192.168.1.20`)。 #### 2. **PLC参数设置(GX Works3)** - **IP地址设置**: - 导航至`参数` → `模块参数` → `以太网端口`,设置PLC的IP地址和子网掩码。 - **Modbus TCP主站配置**: - 在`模块参数`中添加Modbus/TCP通信协议,指定RFID设备的IP地址和端口(默认502)。 #### 3. **PLC程序编写** - **使用指令**: - FX5U支持`MC Protocol`或专用指令(如`MBTCP_READ`/`MBTCP_WRITE`),需根据功能码操作。 - **示例:取RFID标签数据** ```ladder // 假设取RFID设备保持寄存器(功能码03),起始地址H0000,长度2字 M8000(常ON) → MBTCP_READ(Un=1, SlaveIP="192.168.1.20", Port=502, Func=03, Addr=H0000, Len=2, D100) ``` - 数据将存储至PLC的`D100`和`D101`寄存器。 #### 4. **RFID设备配置** - **通信参数**:通过设备Web界面或配置工具设置: - Modbus TCP从站地址(通常为1)。 - 寄存器映射:标签数据存储的寄存器地址(需参考设备手册,例如标签号映射至`H0000`)。 #### 5. **测试与调试** - **通信验证**: - 使用GX Works3的`诊断` → `通信测试`,发送取指令并检查返回数据。 - **错误处理**: - 若通信失败,检查PLC错误代码(如`SD0`寄存器),常见问题包括IP冲突或寄存器地址错误[^2]。 --- ### 示例场景 假设需要取RFID标签的EPC码(假设存储在寄存器`H0000-H0003`): 1. **PLC程序**:连续发送取指令,长度设为4字。 2. **数据处理**:将`D100-D103`的16进制数据转换为ASCII字符串,即为标签EPC。 --- ### 注意事项 - **协议一致性**:确保PLC与RFID设备的Modbus TCP实现兼容(如字节顺序、寄存器寻址方式)。 - **实时性**:Modbus TCP响应时间受网络影响,建议在局域网内使用并优化PLC扫描周期。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值