Internet PLC Forum
General => Technical support => Topic started by: TTCSR on September 17, 2012, 03:55:22 AM
-
I am using a T100MD1616+ and a MMI6050 and have run into a few issues with my project.
I want to monitior and compare inputs. For example, if input 1 is on and any other input or combination of inputs turns on, I want to be able to distinguish this and output an error message. Is there a command line to compare and monitor all the inputs?
TESTIO (1-20) something like that.
-
You can monitor a channel of 16 inputs using INPUT[n] and if any of these turns ON it will return a non zero value.
E.g. INPUT[1] represent input bit #1 to #16.
What you want to do can be coded as follow:
IF TESTBIT (INPUT[1],0) ' if input #1 is ON
IF INPUT[1] & &HFFFE ' check if any other input (#2 to #16) is ON
CALL reportError ' call subroutine to report error.
ENDIF
ENDIF
-
Thank you, it sort of works, but there is still an issue. My code looks like this:
IF TESTBIT (INPUT[1],2) THEN
IF INPUT[1] & HFFFE THEN
SETLCD 0,0, CHR$(1)
SETLCD 1,1,"SHORT CIRCUIT BETWEEN"
SETLCD 2,1,"PIN A3 &"
CALL 8:
DELAY 1000
ENDIF
END IF
CALL 8 LOOKS LIKE THIS....
IF TESTIO(A1_CS)=1 THEN
SETLCD 3,1,"PIN A1"
DELAY1000
ENDIF
IF TESTIO(A5_CS)=1 THEN
SETLCD 3,1,"PIN A5"
DELAY1000
ENDIF
IF TESTIO(A7_CS)=1 THEN
SETLCD 3,1,"PIN A7"
etc......
The problem now is the messages only appear if the first A5_CS occurs. If the other inputs are ON, they cycle, which is fine, however, if A5_CS is gone, the rest will not display their message.
-
You have changed the statement to:
IF TESTBIT (INPUT[1],2)
This means bit #2 of the input word must be ON (which corresponds to digital input #3) in order for the inner block of the IF statement to execute. Is that what your intention is?
Also the mask &FFFE is to mask out bit 0 (digital input #1) of the INPUT[1]. If you want to mask out bit 2 then it should be changed to &FFFB (1111 1111 1111 1011)
-
Awesome! I didn't realize that (INPUT[1],2) corresponded to input #3, I thought it was #2. The mask out info helped as well. If works now, thank you very much ;D
-
I've noticed that even when input #3 is on and inputs 1# to #16 are off, the message...
SETLCD 0,0, CHR$(1)
SETLCD 1,1,"SHORT CIRCUIT BETWEEN"
SETLCD 2,1,"PIN A3 &"
...still remains, should it not disappear?
-
::) Oops nevermind, I put the wrong hexidecimal number in :P
-
I notice your code uses a lot of DELAY function. Although this may work if the system is not expected to handle any input event during the time when the DELAY is being executed, it is probably not the best practice and won't work at all if your system need to still monitor any input changes during this time. One way to provide a delay for something without locking up the CPU into an idle delay time is to use the timer and let the timer contact run another custom function to execute the code after the time out. Another way is to define some interrupt inputs so that critical code associated with the input can run even if the CPU is locked up executing the DELAY function.