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 at java.lang.String.charAt(String.java:658)
完整堆栈跟踪:
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)
答案 0 :(得分:1)
一旦您将outCSVString
连接到您将其链接到的任何其他线表逻辑,您的程序对象外部就会发生一些事情。这很可能是由于您的AsciiToBinary
方法返回了一个空字符串输出,而其他逻辑无法处理。
将outCSVString
连接到其上有StringWritable
历史记录扩展名的StringCov
对象,并查找历史记录在您看到异常的同一时间戳记录的值,确保您的ProgramObject正在生成您期望的输出。
关于您的AsciiToBinary
方法,Tridium框架仅限于它提供的模块以及您可以导入的内容,但它确实与Apache Oro Regular Expression Tools Version 2.0.8打包在一起。搜索&#34; oro&#34;在Niagara帮助文件中获取更多信息。
根据我的经验,如果您使用带有替换的正则表达式来构建字符串,而不是自己标记和迭代字符串,那么outCSVString
将始终遵循所需的格式。