一、OpenTCS4.12 创建一个新的通信驱动

摘要:
很多人研究这个平台,都会卡在第一步,如何创建一个新的通信驱动,官方文档也没怎么写清楚今天写这个博客,是为了帮助大家创建一个新的驱动(具体的通信,我这儿就不讲解)一、首先在官网下载4.12的源码http://www.opentcs.org/en/download.html二、安装IDE我这儿使用的是NetBeans8.2(不会装的就别学JAVA了)不要用Eclipse或者IntelliJIDEA(会

很多人研究这个平台,都会卡在第一步,如何创建一个新的通信驱动,
官方文档也没怎么写清楚
今天写这个博客,是为了帮助大家创建一个新的驱动(具体的通信,我这儿就不讲解)

一、首先在官网下载4.12的源码
http://www.opentcs.org/en/download.html
在这里插入图片描述

二、安装IDE 我这儿使用的是NetBeans8.2(不会装的就别学JAVA了)
不要用Eclipse或者IntelliJ IDEA(会有问题的,不信你试试)
给NetBeans安装Gradle插件(自己百度怎么装,我不管,你不会研究也别学JAVA了)

三、打开项目,选择下载的源码(解压哦)
在这里插入图片描述
在这里插入图片描述

打开后等待会片刻就行(Gradle会自己添加依赖,要联网哟)
在这里插入图片描述

最后双击一下openTCS-CommAdapter-Loopback,openTCS-Kernel以及openTCS-PlatOverView(到时候运行要用到)
在这里插入图片描述

双击完在项目下后,关闭折叠,可以看到这三个项目
在这里插入图片描述

四、创建通信驱动
1.在openTCS-CommAdapter-Loopback下创建一个package(按实际情况来,我这儿比较随意)
在这里插入图片描述
按照官方文档步骤操作
在这里插入图片描述

2.创建一个驱动实现类VehicleCommAdapter(名字随意,我这边用TestCommAdapter)
	a.之类为BasicVehicleCommAdapter 
	b.实现抽象方法

在这里插入图片描述
然后提示需要创建构造方法,那我们就写一个构造方法(参照LoopbackCommunicationAdapter,configuration可以不需要)

在这里插入图片描述

3.此时我们需要新建TestAdapterComponentsFactory和TestVehicleModel这两个东西(超找一下virtualvehicle可以写出来)

在这里插入图片描述

在这里插入图片描述

最后修改一下TestCommAdapter,我的代码如下:

package org.opentcs.testvehicle;
import com.google.inject.assistedinject.Assisted;
import java.util.List;
import static java.util.Objects.requireNonNull;
import javax.inject.Inject;
import org.opentcs.data.model.Vehicle;
import org.opentcs.data.order.Route.Step;
import org.opentcs.drivers.vehicle.BasicVehicleCommAdapter;
import org.opentcs.drivers.vehicle.MovementCommand;
import org.opentcs.util.CyclicTask;
import org.opentcs.util.ExplainedBoolean;
/**
 *
 * @author zjw
 */
public class TestCommAdapter extends BasicVehicleCommAdapter {
  private TestAdapterComponentsFactory componentsFactory;
  private Vehicle vehicle;
  private boolean initialized;
  private CyclicTask testTask;
  @Inject
  public TestCommAdapter(TestAdapterComponentsFactory componentsFactory, @Assisted Vehicle vehicle) {
    super(new TestVehicleModel(vehicle), 2, 1, "CHARGE");
    this.componentsFactory = componentsFactory;
    this.vehicle = vehicle;
  }
  @Override
  public void initialize() {
    initialized = true;
    //网络通信,获取当前位置,电量,等信息
    //getProcessModel().setVehicleState(Vehicle.State.IDLE);
    //getProcessModel().setVehiclePosition("Point-0001");
  }
  @Override
  public synchronized void enable() {
    if (isEnabled()) {
      return;
    }
    //开启线程(略)
    //testTask = new TestTask();
    //Thread simThread = new Thread(testTask, getName() + "-Task");
    //simThread.start();
    super.enable();
  }
  @Override
  public synchronized void disable() {
    if (!isEnabled()) {
      return;
    }
    //线程停止
    //testTask.terminate();
    //testTask = null;
    super.disable();
  }
  @Override
  public void sendCommand(MovementCommand cmd)
      throws IllegalArgumentException {
    requireNonNull(cmd, "cmd");
  }
  @Override
  public ExplainedBoolean canProcess(List<String> operations) {
    requireNonNull(operations, "operations");
    final boolean canProcess = isEnabled();
    final String reason = canProcess ? "" : "adapter not enabled";
    return new ExplainedBoolean(canProcess, reason);
  }
  @Override
  public void processMessage(Object message) {
  }
  @Override
  protected void connectVehicle() {
  }
  @Override
  protected void disconnectVehicle() {
  }
  @Override
  protected boolean isVehicleConnected() {
    return true;
  }
  /**
   * 内部类,用于处理运行步骤
   */
  private class TestTask
      extends CyclicTask {
    private TestTask() {
      super(0);
    }
    //线程执行
    @Override
    protected void runActualTask() {
      try {
        //获取状态  位置  速度  反向
        final MovementCommand curCommand;
        synchronized (TestCommAdapter.this) {
          curCommand = getSentQueue().peek();
        }
        final Step curStep = curCommand.getStep();
        //运行Step,略
        if (!curCommand.isWithoutOperation()) {
          //运行操作(上料或者下料,略)
        }
        if (getSentQueue().size() <= 1 && getCommandQueue().isEmpty()) {
          getProcessModel().setVehicleState(Vehicle.State.IDLE);
        }
        //更新UI
        synchronized (TestCommAdapter.this) {
          MovementCommand sentCmd = getSentQueue().poll();
          if (sentCmd != null && sentCmd.equals(curCommand)) {
            getProcessModel().commandExecuted(curCommand);
            TestCommAdapter.this.notify();
          }
        }
      }
      catch (Exception ex) {
      }
    }
  }
}

4.让Kernel加载该驱动
修改GuiceConfig
在这里插入图片描述

新增下面这两句
在这里插入图片描述

5.创建TestCommAdapterFactory类
在这里插入图片描述
实现抽象方法

在这里插入图片描述

具体代码如下:

package org.opentcs.testvehicle;
import static java.util.Objects.requireNonNull;
import javax.inject.Inject;
import org.opentcs.data.model.Vehicle;
import org.opentcs.drivers.vehicle.VehicleCommAdapter;
import org.opentcs.drivers.vehicle.VehicleCommAdapterFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 *
 * @author zjw
 */
public class TestCommAdapterFactory implements VehicleCommAdapterFactory {
  private static final Logger LOG = LoggerFactory.getLogger(TestCommAdapterFactory.class);
  private TestAdapterComponentsFactory componentsFactory;
  private boolean initialized;
  @Inject
  public TestCommAdapterFactory(TestAdapterComponentsFactory componentsFactory) {
    this.componentsFactory = requireNonNull(componentsFactory, "componentsFactory");
  }
  @Override
  @Deprecated
  public String getAdapterDescription() {
    //这是Kernel中显示的驱动名称,中文会乱码,如果要使用中文,请使用配置文件
    return "MyTestAdapter";
    //return ResourceBundle.getBundle("org/opentcs/virtualvehicle/Bundle").getString("AdapterTestFactoryDescription");
  }
  @Override
  public boolean providesAdapterFor(Vehicle vehicle) {
    requireNonNull(vehicle, "vehicle");
    return true;
  }
  @Override
  public VehicleCommAdapter getAdapterFor(Vehicle vehicle) {
    requireNonNull(vehicle, "vehicle");
    return componentsFactory.createCommAdapter(vehicle);
  }
  @Override
  public void initialize() {
   if (initialized) {
      LOG.debug("Already initialized.");
      return;
    }
    initialized = true;
  }
  @Override
  public boolean isInitialized() {
      return initialized;
  }
  @Override
  public void terminate() {
    if (!initialized) {
      LOG.debug("Not initialized.");
      return;
    }
    initialized = false;
  }
}

6.最后运行一下Kernel以及PlantOverview看一下有没有驱动显示出来
在PlantOverview下Load Model 选择Demo-01.xml
在这里插入图片描述
然后点击File -> Persist mode in the kernel
在这里插入图片描述
在点击File->Mode -> Operating mode切换到操作模式
在这里插入图片描述

在这里插入图片描述

看到以上画面,我们就成功创建了一个驱动,具体怎么通信,我们下次再讲解

免责声明:文章转载自《一、OpenTCS4.12 创建一个新的通信驱动》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇flutter 环境出错后排查js里面如何获取网络地址的图片的高度和宽度 (变通办法)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux系统socket通信编程1

Linux下的Socket编程大体上包括Tcp Socket、Udp Socket即Raw Socket这三种,其中TCP和UDP方式的Socket编程用于编写应用层的socket程序,是我们用得比较多的,而Raw Socket则用得相对较少,不在本文介绍范围之列。 TCP Socket 基于TCP协议的客户端/服务器程序的一般流程一般如下: 它基本上可...

Docker Swarm 创建overlay网络

Docker Swarm 创建overlay网络 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节点:192.168.1.79 工作节点:192.168.1.78 工作节点:192.168.1.77 一、创建网络与服务 1、管理节点:创建overlay网络名字为my-network docker networ...

IBM HACMP 系列 安装和配置二

  一.  HACMP V5.x 标准和扩展配置 HACMP V5.1 引入了标准和扩展 SMIT 配置路径。   1.1 标准配置路径 标准路径允许用户容易地配置最常见的选项,例如: 1)        通过别名的 IPAT 网络 2)        共享的服务 IP 标签 3)        卷组和文件系统 4)        应用程序服务器     ...

AIR串口通信

最近公司的项目中需要用到串口通信,项目是用基于AIR的,AIR本身是不支持串口通信的,本想用 c#或java另写一个负责串口通信的模块,又感觉很烦不想那么弄,就想到了ANE。可惜以前也没弄过 ANE,现研究也感觉麻烦,主要也是因为自己很懒就想在网上找看看有没有现成的ANE,结果还真找到了。   废话说的有点多。 先放上 ANE地址 http://code....

Chrome 扩展crx开发

Chrome扩展提供的入口 左键 crx,popup 右键 crx,homelink + option 右键上下文菜单 Chrome扩展的文件结构 Chrome扩展就是一个文件夹下包括一堆符合规范的文件。首先是清单文件manifest.json,指定了该扩展的整体布局和结构。实例: { // 清单文件的版本,这个必须写,而且必须是2 "mani...

我的WCF之旅 (11): 再谈WCF的双向通讯基于Http的双向通讯 V.S. 基于TCP的双向通讯

在一个基于面向服务的分布式环境中,借助一个标准的、平台无关的Communication Infrastructure,各个Service通过SOAP Message实现相互之间的交互。这个交互的过程实际上就是Message Exchange的过程。WCF支持不同形式的Message Exchange,我们把这称之为Message Exchange Patt...