GE Fanuc PLC with LogicMaster/Proficy: Troubles

rkc109

Member
Join Date
Jul 2008
Location
Maryland
Posts
25
Hi,



I have a question about data collection regarding the GE Fanuc 90/30 PLC. I am using LogicMaster 90/30 as the primary programming environment for the PLC to collect data from an 8-channel analog input module. In addition, I can monitor the data externally with an attached QuickPanel Control. The data from the channels is being stored in select registers. To help you better understand the project, my LogicMaster code uses array moves to take 200 samples of each analog input channel. I have done this by using a register pointer that is incremented by an UpCounter that resets after 200. I successfully stored the LogicMaster program onto the PLC and went ONLINE with it, but no values in the registers are changing. I also successfully configured my PLC rack using the I/O configuration tool, but it did mention that there were problems to examine in a fault table, which I didn’t really understand. As for programming the QuickPanel, I used Proficy Machine Edition to create a QuickPanel target so that I could have variables representing each analog input. These variables were arrays of size 200, but for testing purposes, I just displayed the first 5 samples from each analog input variable to see if the LogicMaster program was functional. Also, for testing purposes, we hooked up a function generator just to the first analog input channel to see if the numbers would change as we fiddled with the generator’s amplitude and frequency. However, I ended up getting a table of 0000’s. I am not sure where to go with this, so if anyone has any suggestions, or need more clarification to understand my problem, please post replies on the thread. Thank you.
 
My first guess is that you forgot to set the length of your Array Move instruction. It defaults to a length of 1. It does not set itself to correspond to the array length of the variable you assign to it.

Post your logic. It will help in the debug process.

Presumably this is the same project you introduced in this thread:
http://www.plctalk.net/qanda/showthread.php?t=40502
 
If that configuration error that you have but did not fix is on the Analog module, you may not be getting any analog data into the PLC.
 
Steve Bailey said:
My first guess is that you forgot to set the length of your Array Move instruction. It defaults to a length of 1.

In VersaPro it defaults to "?" and won't let you compile without setting it first. It was annoying at first, but it sure beats having the machine selecting your array size for you.


rkc109, please post your code.
 
Logic for my program on LM 90/30



8 Array moves (one for each channel)



I will explain one array move because the other seven are identical except assigned to different places.



Array Move #1:



The enable bit I have is T_10MS (It is supposed to be single-shot but I didn’t do that yet)

SR = %AI0001/ AI_1 (Analog Input 1)

SNX = 1

DNX = %R00100 (This is the pointer register)

N = 1

Length is 1 (I am taking 200 samples; the reason for length 1 will make sense after looking at the Up-counter)

DS = %R00201 (First of 200 samples for Analog Input 1)

The ok bit is an internal coil (%M101) titled ARRTR1 (Array Transfer 1 Successful)



The register %R00100 is found in all 8 array moves’ DNX.

There are 8 total internal coils- ARRTR2-8 (meaning all the array moves were successful)



These are the assignments for the other analog inputs’ samples:



AI_2- %R00401-00600

AI_3- %R00601-00600

AI_4- %R00801-01000

AI_5- %R01001-01200

AI_6- %R01201-01400

AI_7- %R01401-01600

AI_8- %R01601-01800



After this, the following rung follows



—|ARRTRF1|—|ARRTRF2|….—|ARRTR8|—(ARRTRF) —



—(ARRTRF) — means that all the array transfers were successful; ARRTRF is also an internal coil



Now I have an Up-Counter instruction following this rung:



The enable bit is —(ARRTRF) —

Address of the Up-Counter is %R00100 (because this is the pointer register that I will be incrementing)

The reset is another internal coil called CNTOUT (Counting to 200 is done, so reset register %R00100)

Preset value is 200

The ok bit is an internal coil CNTOUT (if it reaches this, that means that the counter has reset, and then the entire code will execute again from the first array move)



I hope this logic explanation will help understand what I am doing. The reason I used so many array moves is that I need to assign registers to collect data for each analog input in a tabular format. For example, this means that the registers 201-400 will have analog input 1 data points, 401-600 will have analog input 2, and etc. If someone knows a better way to do all of this, or if the code looks fine, let me know. If it is still confusing as a written explanation, I will obtain the actual LM code and attach it. Then at least I will know that it is not a problem in the logic. Again, thanks to everyone who has replied to me thus far. I hope to hear more from you all.
 
Do us a favor and select the rungs of logic, copy them (Ctrl-C) then paste them into your reply as a
"["Quote"]"(Paste here), (Ctrl-V)"["/Quote"]".
(Removing the """)
 
Last edited:
Length is 1 (I am taking 200 samples; the reason for length 1 will make sense after looking at the Up-counter)

The LEN parameter defines the scope of the Array Move instruction. If LEN = 1, it doesn't matter what number you load into the pointer register, the instruction won't put data into any register higher than the address of the DS register. As I mentioned yesterday, the instruction does not infer the length of the destination table from the size of the array assigned to the DS node. You must specify the length equal to 200.

Also, if you don't change the trigger contact to a one-shot, you could get multiple entries for each sample. The instruction will perform the move from the source to the destination whenever the enable node is true. The T_10ms bit isn't guaranteed to be a one-shot. It is on for 5 msec, then off for 5 msec. A lot will depend on your program's scan time.
 
I'm posting my program logic just so there is an idea of what I am trying to do. Refer to the post where I explained the code in detail (it is on this thread) to get a better idea of what I am trying to accomplish. Any tips can greatly help, thanks.
 
Steve,


So then do I still need the upcounter to increment the pointer register? If I specify 8 different arrays of length 200, that just ensures me that I will be able to increment using the pointer register into a register greater than the values initially at the DS nodes? I hope this made sense, I was in a rush to write this so if it doesn't I will be more elaborate.
 
This is the third time that you have been told the problem, please change it.
The "LEN" MUST BE GREATER THAN OR EQUAL TO BOTH THE "SNX" AND THE "DNX"
IF "POINT_R" IS GREATER THAN "1" IT WILL NOT WORK.
THANK YOU.
 
I understand that, I just want 200 samples from EACH CHANNEL (8 total) to be stored together. I don't want to take 1600 samples that are a collection of all 8 analog channels. If your suggestions ensures that I will have, for example, registers 201-400 storing samples SIMPLY from analog input 1, then I will go ahead with this procedure. Otherwise, increasing the length to 200 is not going to solve my problem. I might just not be understanding your suggestion correctly, so I'm sorry if I have repeated a question.
 
RKC109,

I think you really should get a PLC and test your logic. For some strange reason you seem philosophically opposed to making the change that will make your program work. Instead you stick to your preconceived notions of how you think the function works and argue with the people who are tryng to help. Then, when you finally post your ladder logic you take a screen shot that doesn't show the address of the registers you're using!

Assuming that the address for RINPUT1 is %R201 and the address for RINPUT8 is %R401, then when the value in POINT_R is 1 and T_10MS is true, the functions will copy the current value in AI_1 to%R201 and the current value in AI_8 to %R401.

[BIG HONKIN' DISCLAIMER]
The next sentence is true if and only if the LEN parameter for the ARRAY_MOVE instructions is greater than 1.
[/BIG HONKIN' DISCLAIMER]

When the value in POINT_R is 2 and T_10MS is true, the functions will copy the current value in AI_1 to%R202 and the current value in AI_8 to %R402.

Now, if you're not willing to try changing the LEN parameter, then please go somewhere else to get the answer you want. BTW, Russ and I also hang out at the GE Fanuc forum, so don't expect any different answers over there.
 
Thanks, Steve and Russ. It wasn't that I was opposed to what you guys had to say, just when the program was originally written my boss said to keep the length at one. I kept telling him that 200 was needed for 200 samples but he felt that incrementing the pointer register was enough to do the job. With the clarifications, you both have indeed been a great help and I will make the necessary changes. Hopefully, this will solve the problem, otherwise it might be rooted in the PLC configuration. I do have a PLC to test the program, it's just when I was looking into the registers I displayed on the QP I was getting all 0's. I'll let you know if it changes today.
 

Similar Topics

Got an old machine with a IC610CPU104 CPU. A bit of research told me this is the same as DL305 so DirectSoft from AutomationDirect should work...
Replies
15
Views
2,003
Dear Everyone I work with PLC GE-Fanuc. But I don't know that "PLC GE-Fanuc (Series 90-30 and VersaMax) can Online Edit Programming while...
Replies
9
Views
3,019
Our PLC output 7 opens a valve to move a cylinder rod. The output turns on every minute. The output is supposed to be ON for 10.56 seconds. But...
Replies
3
Views
2,852
Need to find where to get VersaPro or Proficy software for the GE Fanuc 90-30 PLC.
Replies
5
Views
2,521
Good afternoon all, hope everyone is doing well. Could someone explain the pic attached on the wrt.not instruction? To me, it looks the same as...
Replies
6
Views
2,101
Back
Top Bottom