Just lucky I guess

llgermain

Member
Join Date
Jan 2014
Location
Winnemucca, NV
Posts
10
Started work at an old Ormat Geothermal binary power plant in 2010 here in Fallon. I have been an I&C tech for 35 years. That being said I have never had the pleasure of working with the GE Series 6. Which is unfortunate in that there seems to be an abundance of them here. In fact there were so many spare parts I am able to build a complete replica of one of the units at home. Why you ask? The "HMI" (Sarcasm intended) is vintage GE. Meaning, NO trending, or anything that would make an I&C guy's life easy. The alarms function as now you see it and now you don't. They seem to clear when the problem goes away.
I have a spare Workmaster and the software for the communication and I can program the PLC to the limit of my capabilities. Which are substantial, the limits that is.
The purpose of my endevor is to upgrade the HMI. I found KEPWare that I am able to talk to the PLC and used Ignition to start the HMI. So far no real problems. In order to check the operation of the PLC that operates the generator, I built another PLC to simulate the inputs to the units PLC. Everything was going well untill I tried to figure out how to program analog outputs from my simulator. I just cannot seem to figure out how the code works. If anyone has some desire to watch me beat my forhead on the table then I am willing to learn. I have spent close to a year reading the posts of this site and a few others. This one seems to have the expertise that I need.
Thanks in advance for any and all help.
 
Series Six analog output modules are four channels per module and each module takes up 16 bits of output memory space. The first 12 bits represent the data. The next two bits represent the channel number. Thus when both of the channel bits are false, the data in the first twelve bits is for channel 1, when only the first channel bit is true, the data in the first twelve bits is for channel 2, an so on. You will have to write the logic to coordinate the data and channel.

I'll see if I can find the code I used to use for analog outputs and post it tomorrow.
 
Last edited:
I got that far. I am having trouble tying the bits to the register. If I have set the back plane to outputs 97-112. That is where the magic fizzles out. Is the register bound to those outputs or do I need to bind them in the program? I didn't see your last reply until now. I think with a sample I might be able to figure this out. I have been trying to learn this by reverse engineering the existing program but with over 1000 rungs...my head hurts.
 
Last edited:
Here is a routine to control a Series Six analog output module at output address O0321 - O0337. The data values for the four channels are located in registers R00261 through R00261. That is done somewhere else in the program. R00260 serves as a pointer and should not be used anywhere else in the program.

The first rung copies the value from the register between R00261 - R00264 indicated by the value in the pointer register R00260. After copying the value to register R00270, the function increments the value in the pointer register.

The second rung subtracts one from the pointer register and puts the result in register R00270. This is the analog channel number.

The third rung shifts the analog channel number left by twelve places in the register R00270.

The fourth rung fills the lower twelve bits of register R00271 with the analog channel data retrieved in the first rung (IOR instruction) and then copies the contents of register R00271 to the sixteen bits of output memory starting at output O0371 (REG_TO_IO instruction).
 
I was wondering if I misread the first line wrong.

The data values for the four channels are located in registers R00261 through R00261.

Is this true?
 
I think the second should have read "R00264"

These are just temporary storage. The routine shown on successive scans copies one of them (selected by a pointer in R00260) into R00270.

The R00260 pointer is then prepared by subtracting 1 then shifting right 12 places. The result then ends up in R00271 as the 'channel number'.

The channel number is then merged with the channel data by the IOR instruction. All this is still in R00270.

The merged data is then sent to the output bits using the REG TO I/O instruction.

Note: the code to modify the pointer on successive scans is not shown. (1, 2, 3, 4 then back to 1)
 
Last edited:
The data for the four channels needs to be in registers R00261 through R00264.

There is no need for additional logic to increment the pointer. Each time the TABLE_TO_DEST is executed it increments the pointer. The LEN parameter specifies when it rolls over. The rung with the SUBX instruction is necessary because of that action. By the time the SHIFT_LEFT instruction is executed, the pointer has already been incremented so you can't use the pointer value as the channel number in the data to be copied to the outputs.
 
Lets see if I got this.
I set the dip switches to select the starting address of the IO. I then use a register to manipulate the two bits that represent the one output channel. I then move that register to the IO. Am I on the right track?
 
It just occurred to me that I might not have asked the right question. I really don't need an example, I need the steps, in order, that I need to do so I can learn how to do it. Don't get me wrong! I appreciate any and all input from the wizards that inhabit this realm. It's just I don't want the problem solved I want the knowledge!
 
It just occurred to me that I might not have asked the right question. I really don't need an example, I need the steps, in order, that I need to do so I can learn how to do it. Don't get me wrong! I appreciate any and all input from the wizards that inhabit this realm. It's just I don't want the problem solved I want the knowledge!


Without even discussing the code, what you are attempting to do is to store 4 different analog output values in temporary (conveniently consecutive) holding registers within your program logic. You are then multiplexing all four words of this data through a 16 bit message interface with the analog output module. In addition to the analog output data for each channel, you must also embed a channel number, so that the analog output module knows which output channel is the intended destination for the data that it just received.
 
1. Put the data for the analog output into the first twelve of the sixteen outputs assigned to the module.

2. Put the channel number (zero) into the thirteenth and fourteenth of the sixteen outputs assigned to the module.

At the conclusion of the program scan, the CPU will transfer all sixteen bits of output data to the module. When the module receives the data it will decode the channel number and apply the data value to the proper channel.

During the next PLC scan your logic needs to repeat steps 1 and 2 for channel 1.
One scan later, repeat steps 1 and 2 for channel 2.
One scan later, repeat steps 1 and 2 for channel 3.

One scan later, repeat steps 1 and 2 for channel 0.
One scan later, repeat steps 1 and 2 for channel 1.
One scan later, repeat steps 1 and 2 for channel 2.
One scan later, repeat steps 1 and 2 for channel 3.

Continue as long as the program runs.
 
Well at first i showed no output to the meter. After looking at the outputs and watching them change I wired up an old mA 0-100% meter from a Rosemount transmitter and lo and behold I have outputs!
Looks like I picked the right web site to join. Thanks a lot guys for your selfless sharing. I DO appreciate it. YOU ARE đź‘Ľ
 

Similar Topics

The Symantec summary on Dragonfly states that a certain manufacturer of PLC is the target of this malware. But, they don't get specific. Does...
Replies
3
Views
2,179
My fearless leader just dropped a knot into my programing for the day..I have to put 3 heater loops (feeding 3 groups of 2 banks) into a AD DL260...
Replies
10
Views
3,829
I recieved from kser via private message: kser, do you have any specific hardware you are trying to use to measure temperature? Are you...
Replies
5
Views
3,402
Back
Top Bottom