06-18-2015 10:11 AM
Hello!
I got a syntax problem concerning the channel calculation (I have to admit I'm not an expert at all...).
Here is the Problem: I got a measurement with two groups and several channels. I have to create a new channel that switches to 1 if the right conditions are given and goes zero if they are not fullfilled. My problem is that I don't know how to execute a calculation and how to adress the channels within an if-loop.
It should look somehow like this:
Call BadExample
Function BadExample(NewCreatedChannel)
If
("Ch('[2]/Example')>= 1000) and ("Ch('[2]/Example2') < 1600) and ("Ch('[2]/Example3') > 10) and ("Ch('[2]/Example4')< 0.025*("Ch('[2]/Example5')+ 10) and ("Ch('[2]/Example6') > 210)
or
("Ch('[2]/Example')>= 1200) and ("Ch('[2]/Example2') < 1800) and ("Ch('[2]/Example3') > 10) and ("Ch('[2]/Example4')< 0.025*("Ch('[2]/Example5')+ 10) and ("Ch('[2]/Example6') > 240)
then
NewCreatedChannel=1
Else
NewCreatedChannel=0
End if
End Function
I know that this won't work...but I hope you'll get the idea!
It would even help me if someone could tell me how to implement a calculated channel within this loop.
Thanks!!!!
Solved! Go to Solution.
06-19-2015 04:56 AM
Hey Melihson,
there are many possibilities to do this.
One example is to use the calculator function IIF that works with channels as well.
You just have to declare the condition and to choose the true and false values which can be 0 and 1.
Here's a simple example using the Example.TDM file:
Call Data.Root.Clear()
Call DataFileLoad("EXAMPLE.TDM","TDM","Load")
Call Calculate("Ch(""Results/Res1"") = IIF(Ch(""[2]/Schall_1"")>0.1, 1, 0)")
Call Calculate("Ch(""Results/Res2"") = IIF(Ch(""[2]/Schall_2"")>0.4, 1, 0)")
Call Calculate("Ch(""Results/ResAnd"")= AndB(Ch(""Results/Res1""),Ch(""Results/Res2""))")
If you're using the english version just change the channel names.
This code snipped evaluates two channels and combines them logically with AndB function.
You can also use this approach for more than two channels.
Best regards
Christian
06-19-2015 05:37 AM
If you want to index channel data in a loop you can also use this approach which does exactly the same:
Call Data.Root.Clear()
Call DataFileLoad("EXAMPLE.TDM","TDM","Load")
const Chn1 = "[2]/Schall_1" 'channel 1
const Chn2 = "[2]/Schall_2" 'channel 2
dim i, length, ChnRes, ChnResNo, Chn1No, Chn2No
length = CL(Chn1) 'get channel length
ChnRes = ChnAlloc("Result",length,1,DataTypeFloat64) 'allocate result channel memory for better performance
ChnResNo = CNo(ChnRes(0)) 'get result channel number
Chn1No = CNo(Chn1) 'get channel 1 number
Chn2No = CNo(Chn2) 'get channel 2 number
for i=1 to length
'ChD for channel read and ChDx for channel write without updating properties everytime
if ChD(i,Chn1No)>0.1 and ChD(i,Chn2No)>0.4 then
ChDx(i,ChnResNo) = 1
else
ChDx(i,ChnResNo) = 0
end if
next
'update channel properties
Call ChnPropSet(ChnResNo, "length", length)
Call ChnCharacter(ChnResNo)
Regards
Christian
06-19-2015 07:07 AM
06-19-2015 07:55 AM
Hi All,
FYII, the Calculate() command will always execute much faster than an explicit FOR NEXT loop and ChD() or Channel.Values() data access.
Brad Turpin
DIAdem Product Support Engineer
National Instruments