-5
public void onStart() throws Exception
{
  // start up code here
}enter code here

public void onExecute() throws Exception
{
  // execute code (set executeOnChange flag on inputs)
  String tmp = getInASCIIString().getValue();
  setOutCSVString(new BStatusString(AsciiToBinary(tmp)));
}

public void onStop() throws Exception
{
  // shutdown code here
}

public static String AsciiToBinary(String asciiString) throws Exception
{  
  String padding = "00000000";
  StringBuffer dataString = new StringBuffer();
  StringBuffer outCSV = new StringBuffer();
  StringTokenizer Values = new StringTokenizer(asciiString,",");
     while (Values.hasMoreTokens()) 
     {
        String bin = padding + Integer.toBinaryString(Integer.parseInt(Values.nextToken()));
        String reversedString = new StringBuffer(bin.substring(bin.length() - 8, bin.length())).reverse().toString();
        dataString.append(reversedString); 
     }
  try
  {
      char[] charArray = dataString.toString().toCharArray();
      for (int i = 1; i < charArray.length; i++) 
      {
        if (charArray[i] == '1')
        {
          outCSV.append(i+"");
          outCSV.append(',');
        } 
      } 
      if (outCSV.toString().length() > 1)  
      {
        return outCSV.toString().substring(0, outCSV.toString().length()-1);
      }
      else
      {
        return outCSV.toString();
      }
  }
  catch(StringIndexOutOfBoundsException e)
  {
    return ""; 
  }

}

我们使用 Tridium——它使用 Java 作为后端。这个程序似乎是随机的,偶尔会抛出错误。我只限于预装的包,包括:java.util、java.baja.sys、javax.baja.status、javax.baja.util、com.tridium.program

这就是为什么一些代码是使用它所做的逻辑/功能编写的。无论如何-我无法弄清楚为什么这会引发错误。有什么想法吗?

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:java.lang.String.charAt(String.java:658)处的 15

完整的堆栈跟踪:

java.lang.StringIndexOutOfBoundsException: String index out of range: 15
 at java.lang.String.charAt(String.java:658)
 at com.korsengineering.niagara.conversion.BStatusNumericToStatusBoolean.changed(BStatusNumericToStatusBoolean.java:38)
 at com.tridium.sys.schema.ComponentSlotMap.fireComponentEvent(ComponentSlotMap.java:1000)
 at com.tridium.sys.schema.ComponentSlotMap.modified(ComponentSlotMap.java:902)
 at com.tridium.sys.schema.ComplexSlotMap.modified(ComplexSlotMap.java:1538)
 at com.tridium.sys.schema.ComplexSlotMap.setDouble(ComplexSlotMap.java:1254)
 at javax.baja.sys.BComplex.setDouble(BComplex.java:666)
 at com.tridium.sys.schema.ComplexSlotMap.copyFrom(ComplexSlotMap.java:294)
 at javax.baja.sys.BComplex.copyFrom(BComplex.java:246)
 at javax.baja.sys.BLink.propagatePropertyToProperty(BLink.java:593)
 at javax.baja.sys.BLink.propagate(BLink.java:523)
 at com.tridium.sys.engine.SlotKnobs.propagate(SlotKnobs.java:56)
 at com.tridium.sys.schema.ComponentSlotMap.modified(ComponentSlotMap.java:899)
 at com.tridium.sys.schema.ComplexSlotMap.modified(ComplexSlotMap.java:1538)
 at com.tridium.sys.schema.ComplexSlotMap.setDouble(ComplexSlotMap.java:1254)
 at javax.baja.sys.BComplex.setDouble(BComplex.java:666)
 at javax.baja.status.BStatusNumeric.setValue(BStatusNumeric.java:66)
 at com.tridium.kitControl.conversion.BStatusStringToStatusNumeric.calculate(BStatusStringToStatusNumeric.java:161)
 at com.tridium.kitControl.conversion.BStatusStringToStatusNumeric.changed(BStatusStringToStatusNumeric.java:155)
 at com.tridium.sys.schema.ComponentSlotMap.fireComponentEvent(ComponentSlotMap.java:1000)
 at com.tridium.sys.schema.ComponentSlotMap.modified(ComponentSlotMap.java:902)
 at com.tridium.sys.schema.ComplexSlotMap.modified(ComplexSlotMap.java:1538)
 at com.tridium.sys.schema.ComplexSlotMap.setString(ComplexSlotMap.java:1335)
 at javax.baja.sys.BComplex.setString(BComplex.java:668)
 at com.tridium.sys.schema.ComplexSlotMap.copyFrom(ComplexSlotMap.java:295)
 at javax.baja.sys.BComplex.copyFrom(BComplex.java:246)
 at javax.baja.sys.BLink.propagatePropertyToProperty(BLink.java:593)
 at javax.baja.sys.BLink.propagate(BLink.java:523)
 at com.tridium.sys.engine.SlotKnobs.propagate(SlotKnobs.java:56)
 at com.tridium.sys.schema.ComponentSlotMap.modified(ComponentSlotMap.java:899)
 at com.tridium.sys.schema.ComplexSlotMap.modified(ComplexSlotMap.java:1538)
 at com.tridium.sys.schema.ComplexSlotMap.setString(ComplexSlotMap.java:1335)
 at javax.baja.sys.BComplex.setString(BComplex.java:668)
 at com.tridium.sys.schema.ComplexSlotMap.copyFrom(ComplexSlotMap.java:295)
 at javax.baja.sys.BComplex.copyFrom(BComplex.java:238)
 at javax.baja.control.BControlPoint.doExecute(BControlPoint.java:271)
 at auto.javax_baja_control_BStringWritable.invoke(AutoGenerated)
 at com.tridium.sys.schema.ComponentSlotMap.invoke(ComponentSlotMap.java:1599)
 at com.tridium.sys.engine.EngineUtil.doInvoke(EngineUtil.java:49)
 at com.tridium.sys.engine.EngineManager.checkAsyncActions(EngineManager.java:364)
 at com.tridium.sys.engine.EngineManager.execute(EngineManager.java:209)
 at com.tridium.sys.engine.EngineManager$EngineThread.run(EngineManager.java:691)
4

1 回答 1

1

outCSVString一旦您将您的程序对象连接到您将其链接到的任何其他线路板逻辑,就会在您的程序对象之外发生一些事情。这很可能是因为您的AsciiToBinary方法返回了其余逻辑无法处理的空字符串输出。

outCSVString连接到StringWritable具有StringCov历史扩展的对象,并在您看到异常的同一时间戳查找历史记录的值,以确保您的 ProgramObject 正在生成您期望的输出。

关于您的AsciiToBinary方法,Tridium 框架在其提供的模块和您可以导入的模块中受到限制,但是它确实与 Apache Oro 正则表达式工具版本 2.0.8 打包在一起。在 Niagara 帮助文件中搜索“oro”以获取更多信息。

outCSVString根据我的经验,如果您使用带有替换的正则表达式来构建字符串,而不是自己对字符串进行标记和迭代,您将更加确信始终遵循所需的格式。

于 2015-09-16T13:38:57.757 回答