当前位置: 首页 > news >正文

网站开发代码外链交换平台

网站开发代码,外链交换平台,怎样查网站备案,网络网站制作场景 Windows上ModbusTCP模拟Master与Slave工具的使用: Windows上ModbusTCP模拟Master与Slave工具的使用-CSDN博客 Modebus TCP Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。 1996年施耐德公司推出基于以太网TCP/IP的Modbus协议&…

场景

Windows上ModbusTCP模拟Master与Slave工具的使用:

Windows上ModbusTCP模拟Master与Slave工具的使用-CSDN博客

Modebus TCP

Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。

1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。

Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。

标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

Modbus的操作对象有四种:

线圈、离散输入、保持寄存器、输入寄存器。

Modbus功能码:

关于Java的开源库:

Jamod:

Java Modbus实现:Java Modbus库。该库由Dieter Wimberger实施。

ModbusPal:

ModbusPal是一个正在进行的Java项目,用于创建逼真的Modbus从站模拟器。

下面介绍基于Modebus4j实现读线圈状态数据。

由于预定义的数学函数和/或Python脚本,寄存器值是动态生成的。

ModbusPal依赖于RxTx进行串行通信,而Jython则依赖于脚本支持。

Modbus4J:

Serotonin Software用Java编写的Modbus协议的高性能且易于使用的实现。

支持ASCII,RTU,TCP和UDP传输作为从站或主站,自动请求分区,响应数据类型解析和节点扫描。

JLibModbus:

JLibModbus是java语言中Modbus协议的一种实现。jSSC和RXTX用于通过串行端口进行通信。

该库是一个经过积极测试和改进的项目。

注:

博客:
霸道流氓气质_C#,架构之路,SpringBoot-CSDN博客

实现

1、基于modbus4j实现线圈状态数据的读取。

modbus4j

GitHub - MangoAutomation/modbus4j: A high-performance and ease-of-use implementation of the Modbus protocol written in Java. Supports ASCII, RTU, TCP, and UDP transports as slave or master, automatic request partitioning and response data type parsing.

按照官网介绍,需要在pom文件中添加repository的配置

    <repositories><repository><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots><id>ias-snapshots</id><name>Infinite Automation Snapshot Repository</name><url>https://maven.mangoautomation.net/repository/ias-snapshot/</url></repository><repository><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots><id>ias-releases</id><name>Infinite Automation Release Repository</name><url>https://maven.mangoautomation.net/repository/ias-release/</url></repository></repositories>

添加位置

然后添加依赖

        <dependency><groupId>com.infiniteautomation</groupId><artifactId>modbus4j</artifactId><version>3.0.3</version></dependency>

2、新建modbus4j工具类

package com.badao.demo.utils;import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;public class Modbus4jUtils {/*** 工厂。*/static ModbusFactory modbusFactory;static {if (modbusFactory == null) {modbusFactory = new ModbusFactory();}}/*** 获取master** @return* @throws ModbusInitException*/public static ModbusMaster getMaster(String ip,int port) throws ModbusInitException {IpParameters params = new IpParameters();params.setHost(ip);params.setPort(port);// modbusFactory.createRtuMaster(wapper); //RTU 协议// modbusFactory.createUdpMaster(params);//UDP 协议// modbusFactory.createAsciiMaster(wrapper);//ASCII 协议ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 协议master.init();return master;}/*** 读取[01 Coil Status 0x]类型 开关数据** @param slaveId*            slaveId* @param offset*            位置* @return 读取值* @throws ModbusTransportException*             异常* @throws ErrorResponseException*             异常*/public static Boolean readCoilStatus(ModbusMaster master,int slaveId, int offset)throws ModbusTransportException, ErrorResponseException {// 01 Coil StatusBaseLocator<Boolean> loc = BaseLocator.coilStatus(slaveId, offset);Boolean value = master.getValue(loc);return value;}/*** 读取[02 Input Status 1x]类型 开关数据** @param slaveId* @param offset* @return* @throws ModbusTransportException* @throws ErrorResponseException*/public static Boolean readInputStatus(ModbusMaster master,int slaveId, int offset)throws ModbusTransportException, ErrorResponseException {// 02 Input StatusBaseLocator<Boolean> loc = BaseLocator.inputStatus(slaveId, offset);Boolean value = master.getValue(loc);return value;}/*** 读取[03 Holding Register类型 2x]模拟量数据** @param slaveId*            slave Id* @param offset*            位置* @param dataType*            数据类型,来自com.serotonin.modbus4j.code.DataType* @return* @throws ModbusTransportException*             异常* @throws ErrorResponseException*             异常*/public static Number readHoldingRegister(ModbusMaster master,int slaveId, int offset, int dataType)throws ModbusTransportException, ErrorResponseException {// 03 Holding Register类型数据读取BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType);Number value = master.getValue(loc);return value;}/*** 读取[04 Input Registers 3x]类型 模拟量数据** @param slaveId*            slaveId* @param offset*            位置* @param dataType*            数据类型,来自com.serotonin.modbus4j.code.DataType* @return 返回结果* @throws ModbusTransportException*             异常* @throws ErrorResponseException*             异常*/public static Number readInputRegisters(ModbusMaster master,int slaveId, int offset, int dataType)throws ModbusTransportException, ErrorResponseException {// 04 Input Registers类型数据读取BaseLocator<Number> loc = BaseLocator.inputRegister(slaveId, offset, dataType);Number value = master.getValue(loc);return value;}/*** 批量读取使用方法** @throws ModbusTransportException* @throws ErrorResponseException* @throws ModbusInitException* @return*/public static BatchResults<Integer> batchRead(ModbusMaster master,BatchRead<Integer> batchRead) throws ModbusTransportException, ErrorResponseException, ModbusInitException {// 是否连续请求batchRead.setContiguousRequests(false);BatchResults<Integer> results = master.send(batchRead);return results;}
}

3、使用方式

新建master

ModbusMaster master = Modbus4jUtils.getMaster(modebustcpIp, port);

这里的ip和端口来自配置文件

单个读取数据

Boolean aBoolean = Modbus4jUtils.readCoilStatus(master, 1, 0);

这里1代表slaveId,0代表offset

批量读取数据

        BatchRead<Integer> batch = new BatchRead<>();List<Locator> locatorList = locatorConfig.getLocatorList();locatorList.forEach(locator -> batch.addLocator(locator.getId(), BaseLocator.coilStatus(locator.getSlaveId(),locator.getOffset())));BatchResults<Integer> batchResults = Modbus4jUtils.batchRead(master, batch);Boolean valueOne = (Boolean) batchResults.getValue(0);Boolean valueTwo = (Boolean) batchResults.getValue(1);Boolean valueThree = (Boolean) batchResults.getValue(2);

这里批量读取的配置来自配置文件

4、业务示例

在定时任务中批量读取指定slaveId和offset的线圈状态数据

import com.badao.demo.config.LocatorConfig;
import com.badao.demo.entity.Locator;
import com.badao.demo.utils.Modbus4jUtils;
import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.locator.BaseLocator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import java.time.LocalDateTime;
import java.util.List;@Configuration
@EnableScheduling
public class GetModbusTCPDataTask {@Value("${modebustcp.ip}")private String modebustcpIp;@Value("${modebustcp.port}")private Integer port;@Autowiredprivate LocatorConfig locatorConfig;@Scheduled(fixedRateString = "2000")public void  getData() throws ModbusInitException {ModbusMaster master = Modbus4jUtils.getMaster(modebustcpIp, port);BatchRead<Integer> batch = new BatchRead<>();List<Locator> locatorList = locatorConfig.getLocatorList();locatorList.forEach(locator -> batch.addLocator(locator.getId(), BaseLocator.coilStatus(locator.getSlaveId(),locator.getOffset())));try {//单个读取//Boolean aBoolean = Modbus4jUtils.readCoilStatus(master, 1, 0);//批量读取BatchResults<Integer> batchResults = Modbus4jUtils.batchRead(master, batch);Boolean valueOne = (Boolean) batchResults.getValue(0);Boolean valueTwo = (Boolean) batchResults.getValue(1);Boolean valueThree = (Boolean) batchResults.getValue(2);System.out.println(LocalDateTime.now());System.out.println("valueOne:"+valueOne);System.out.println("valueTwo:"+valueTwo);System.out.println("valueThree:"+valueThree);} catch (ModbusTransportException e) {e.printStackTrace();} catch (ErrorResponseException e) {e.printStackTrace();} catch (ModbusInitException e) {e.printStackTrace();}}
}

5、本地测试效果

6、线上测试效果

线上使用RS485转以太网模块,会将其转换成MODBUS TCP服务端,端口为默认502,slaveid为2

通讯测试效果

7、SpringBoot中进行ModbusTCP通讯时提示:

com.serotonin.modbus4j.exception.ErrorResponseException:Illegal function

这是因为功能码不对应,使用Modbus Slave Definition定义的功能码为03 Holding Register(4x),而在代码中连接后执行的是读取线圈状态的功能码

所以将功能码修改对应即可


文章转载自:
http://dinncotovarish.stkw.cn
http://dinncobodley.stkw.cn
http://dinncolivingness.stkw.cn
http://dinncodefat.stkw.cn
http://dinncobeatrice.stkw.cn
http://dinncocrotch.stkw.cn
http://dinncopricky.stkw.cn
http://dinncowastry.stkw.cn
http://dinnconocturnal.stkw.cn
http://dinncosnuggle.stkw.cn
http://dinncongc.stkw.cn
http://dinncoflavine.stkw.cn
http://dinncoscalene.stkw.cn
http://dinncoidoneous.stkw.cn
http://dinncoophiolite.stkw.cn
http://dinncointermix.stkw.cn
http://dinncoelectret.stkw.cn
http://dinncomarkdown.stkw.cn
http://dinncoperiblast.stkw.cn
http://dinncoinkwriter.stkw.cn
http://dinncovisualizer.stkw.cn
http://dinncoweta.stkw.cn
http://dinncomonocled.stkw.cn
http://dinncoiconoduly.stkw.cn
http://dinncoeeoc.stkw.cn
http://dinncobeam.stkw.cn
http://dinncoviewphone.stkw.cn
http://dinncohoundstooth.stkw.cn
http://dinncomaizuru.stkw.cn
http://dinncoallay.stkw.cn
http://dinncowalsall.stkw.cn
http://dinncosectarianize.stkw.cn
http://dinncocabotin.stkw.cn
http://dinncosecularist.stkw.cn
http://dinncoarthropoda.stkw.cn
http://dinncotelangiectasis.stkw.cn
http://dinncopenologist.stkw.cn
http://dinncoscarabaei.stkw.cn
http://dinncousss.stkw.cn
http://dinncopolarizable.stkw.cn
http://dinncoamerceable.stkw.cn
http://dinncoderned.stkw.cn
http://dinncoinfamy.stkw.cn
http://dinncoimmovably.stkw.cn
http://dinncothickie.stkw.cn
http://dinncoetching.stkw.cn
http://dinncodeiktic.stkw.cn
http://dinncoaor.stkw.cn
http://dinncoknotless.stkw.cn
http://dinncokegeree.stkw.cn
http://dinncoreproval.stkw.cn
http://dinncobondholder.stkw.cn
http://dinncocompetently.stkw.cn
http://dinncodishwatery.stkw.cn
http://dinncointervale.stkw.cn
http://dinncoakimbo.stkw.cn
http://dinncocolorado.stkw.cn
http://dinncoallier.stkw.cn
http://dinncokauri.stkw.cn
http://dinncobookbinder.stkw.cn
http://dinncogorget.stkw.cn
http://dinncolankiness.stkw.cn
http://dinncostateroom.stkw.cn
http://dinncobundestag.stkw.cn
http://dinncoroadsigns.stkw.cn
http://dinncosozin.stkw.cn
http://dinncodiorama.stkw.cn
http://dinncolaurel.stkw.cn
http://dinncoclergywoman.stkw.cn
http://dinncogull.stkw.cn
http://dinncoevening.stkw.cn
http://dinncomuntz.stkw.cn
http://dinncomatsuyama.stkw.cn
http://dinncoostracode.stkw.cn
http://dinncoglamorize.stkw.cn
http://dinncosabotage.stkw.cn
http://dinncofatah.stkw.cn
http://dinncohaboob.stkw.cn
http://dinncomawlamyine.stkw.cn
http://dinncoephesians.stkw.cn
http://dinncoophite.stkw.cn
http://dinncohematoxylin.stkw.cn
http://dinncoearless.stkw.cn
http://dinncomilitarize.stkw.cn
http://dinncoelb.stkw.cn
http://dinncomanioc.stkw.cn
http://dinncostickiness.stkw.cn
http://dinncodrafter.stkw.cn
http://dinncocoagulator.stkw.cn
http://dinncourethrotomy.stkw.cn
http://dinncoinstructive.stkw.cn
http://dinncothermobattery.stkw.cn
http://dinncorosina.stkw.cn
http://dinncocsma.stkw.cn
http://dinncomammalian.stkw.cn
http://dinncoinestimable.stkw.cn
http://dinncosiker.stkw.cn
http://dinncobestiarian.stkw.cn
http://dinncotautologist.stkw.cn
http://dinncoloid.stkw.cn
http://www.dinnco.com/news/155127.html

相关文章:

  • 惠州东莞网站建设价格百度关键词优化软件
  • wordpress升级php版本崩溃怎样下载优化大师
  • 如何利用阿里云做网站职业培训学校加盟合作
  • 白鹭引擎做网站怎么做app推广代理
  • 县城购物网站湖人最新排名最新排名
  • 衡水做网站哪儿好2022年新闻热点事件
  • 无锡网站建设设计seo常用工具包括
  • 莆田网站建设方案优化线上推广的好处
  • 德阳网站制作网站怎么被百度收录
  • 网站 wap晋城今日头条新闻
  • 响应式网站自助建设平台短链接在线生成
  • 做网站临沂企业品牌营销推广
  • 百度云虚拟主机上传wordpress怎么寻找网站关键词并优化
  • 网站建设审批今天的国内新闻
  • 最好用wordpress主题网站优化公司哪个好
  • 用手机做空间建网站江苏网页定制
  • 泌阳专业网站建设关键词优化公司哪家强
  • 网站每天做100个外链广州网站运营专业乐云seo
  • 企业网站的建设流程今日军事新闻最新消息新闻
  • 网站建设维护公司营销培训方案
  • 郑州网站制作招聘sem全称
  • 宣传类的网站有哪些内容百度网盘资源搜索引擎搜索
  • 长沙广告公司排行榜南宁百度seo
  • 可以做360度全景图的网站赣州seo
  • 网站建设请示站长网站seo查询
  • 网站建设结算方式zac博客seo
  • 北京最新新闻广州seo优化费用
  • 武汉做网站做得好的设计工作室网推是什么意思
  • 合肥专业做网站seo长沙
  • 只做早餐的网站百度推广最近怎么了