Hello, I am new to codesys and I'm trying figure out a good method that would allow me to receive a decimal number (input) and convert it to binary allowing me to turn on 128 bits (outputs). I could really use some suggestions.
thanks for your input
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2015-09-03
Originally created by: scott_cunningham
Simple to do in ST:
PROGRAMPLC_PRGVAR
  Out  : ARRAY[0..127] OFBOOL;
  Decimal : WORD;
  Temp : WORD;
  J: INT;END_VARTemp :=Decimal;FORJ :=0TO15DO
  Out[J] :=Temp.0;
  Temp :=SHR(Temp, 1);END_FOR
Typically BIT operations are used on type BYTE/WORD/DWORD for clarity (instead of INT, DINT), but the example code also works if Decimal is an INT or DINT.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
A customer makes a purchase and he/she has the 128 options. I'm trying to receive 1 variable that can be a combination of any of those 128 options. Obviously that is 4 DWords. I was thinking decimal might be the best way
I'm not sure
Or maybe have them send me an string of 128 (0 or 1)....but then I'd need to convert that into an array of bool....
If you have suggestions let me know.
Thanks again
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2015-09-03
Originally created by: scott_cunningham
I corrected my last post - shifting over 128 bits against a WORD won't help (only gives outputs 0..15).
How is the information being delivered to you? Over a fieldbus, by a file, by ??? The most compact data transfer is by sending you 4 DWORDs, each DWORD controlling 32 outputs. You could require a 128 character string, but that costs transmission time and seems a bit crude.
So maybe quickly solve as:
PROGRAMMapOutputsVAR_INPUT  Outs_92_131:DWORD;  Outs_62_91 :DWORD;  Outs_32_61 :DWORD;  Outs_0_31  :DWORD;END_VARVAR  Out  :ARRAY[0..127]OFBOOL;END_VARFORJ:=0TO127DO  IFJ=0THEN    Temp:=Out_0_31;  ELSIFJ=32THEN    Temp:=Out_32_61;  ELSIFJ=64THEN    Temp:=Out_62_95;  ELSIFJ=96THEN    Temp:=Out_92_127;  END_IF  Out[J]:=Temp.0;  Temp:=SHR(Temp,1);END_FOR
There are many other more ways to solve this - offered as a down-and-dirty method to show concept.
You may also want to think about using a structure of BOOLs (not the same as a structure of BITS) if you want your code to show meaning for the output instead of just a bit on a DWORD. For example, it may make more sense to specifically call out things like option A, option B, feature 17. From there you can map those specific items to specific outputs. For troubleshooting this is "better" because it speaks human. For coding, it takes longer:
TYPET_OUT:STRUCT
  Option1  :BOOL;
  Option2  :BOOL;
  FeatureA  :BOOL;
  TopNotch  :BOOL;
  ...END_STRUCTEND_TYPEPROGRAMPLC_PRGVAR_INPUT
  Outs  :T_OUT;END_VAR
Then map each item of the structure to an output on your hardware IO mapping, which would look like:
Ultimately, you really have to decide how your "customer" can give you the information easily and without errors such as flipping bit order, etc.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
128 bits is a very very big decimal number.
so 8 bits is 255 16 bits is 65535
128 is 3,4028236692093846346337460743177e+38 oops so other solution isneeded.
so we will need more info.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
When a customer makes a purchase, the POS needs to send me some type of information that lets me know what combination of outputs need to be turned on (what combination of outputs the customer purchased).
My original thought was POS sends me a decimal over modbus and I convert to a word. But like you stated the decimal for 128 bits is too large for decimal form. So now I'm trying to determine the next best solution.
POS could send array, string, maybe 4 double words. But I think I'd prefer an array. Reason being, the array index could represent the bits and the value of the array at the index could represent the value of the bit.
That is what I am thinking now but I would love suggestions from another who has more experience than me. This is my first time working with Modbus so I'd like to communicate as efficiently as possible.
Thank you again for responding to my question, I look forward to reading your response
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
find the number in an array, giving you back the type number.
with this type you can set a lot of bits by using for simplicity 16 arrays of 8 bits or 8 arrays with words.
example POS says 123
array [200 types,2]
find number 123 in array, if found you get back a typenumber
another array has out [200,8] words
so go to typenumber and you will find the bits needed.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
shooter hat geschrieben:
so you get a limited decimal number
find the number in an array, giving you back the type number.
with this type you can set a lot of bits by using for simplicity 16 arrays of 8 bits or 8 arrays with words.
example POS says 123
array [200 types,2]
find number 123 in array, if found you get back a typenumber
another array has out [200,8] words
so go to typenumber and you will find the bits needed.
I'm not sure i am understanding. Do you know where I can research the concept to better understand.
What do you mean array [200 types, 2]? A 2-dimensional array of...? Is 123 a value of an array[index]? What exactly is typenumber...never heard of it before. Please know I am asking for clarity not being a pain or sarcastic. I am really trying to understand. Thank you for all your help
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
lets assume the factory makes a cabinet with max 128 drawers (your bits)
the customer checks the catalogue
in the cat there are lots of types like 3 drawer bottom is type 1
3 drawer top is type 2
3 drawer 5 from bottom is type 3
5 drawer 5 from bottom 6 drawers open then 2 drawers is type 4
etc.
and picks a cabinet.
he gives you the typenumber for example 3 as a word.
you have an array with these typenumbers as look up list and 8 words so for easy it is array [9,100] of word:=(.......,3,11100000,0,0,0,0,0,0,0,4,0000001111100000,0000000000000011,.......)
so word1 is array[2,2]word2 is 3,2 etc.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hello, I am new to codesys and I'm trying figure out a good method that would allow me to receive a decimal number (input) and convert it to binary allowing me to turn on 128 bits (outputs). I could really use some suggestions.
thanks for your input
Originally created by: scott_cunningham
Simple to do in ST:
Typically BIT operations are used on type BYTE/WORD/DWORD for clarity (instead of INT, DINT), but the example code also works if Decimal is an INT or DINT.
Scott first thank you for your response.
Just to give you more detail.
A customer makes a purchase and he/she has the 128 options. I'm trying to receive 1 variable that can be a combination of any of those 128 options. Obviously that is 4 DWords. I was thinking decimal might be the best way
I'm not sure
Or maybe have them send me an string of 128 (0 or 1)....but then I'd need to convert that into an array of bool....
If you have suggestions let me know.
Thanks again
Originally created by: scott_cunningham
I corrected my last post - shifting over 128 bits against a WORD won't help (only gives outputs 0..15).
How is the information being delivered to you? Over a fieldbus, by a file, by ??? The most compact data transfer is by sending you 4 DWORDs, each DWORD controlling 32 outputs. You could require a 128 character string, but that costs transmission time and seems a bit crude.
So maybe quickly solve as:
There are many other more ways to solve this - offered as a down-and-dirty method to show concept.
You may also want to think about using a structure of BOOLs (not the same as a structure of BITS) if you want your code to show meaning for the output instead of just a bit on a DWORD. For example, it may make more sense to specifically call out things like option A, option B, feature 17. From there you can map those specific items to specific outputs. For troubleshooting this is "better" because it speaks human. For coding, it takes longer:
Then map each item of the structure to an output on your hardware IO mapping, which would look like:
Ultimately, you really have to decide how your "customer" can give you the information easily and without errors such as flipping bit order, etc.
128 bits is a very very big decimal number.
so 8 bits is 255 16 bits is 65535
128 is 3,4028236692093846346337460743177e+38 oops so other solution isneeded.
so we will need more info.
Thank you for your response shooter.
When a customer makes a purchase, the POS needs to send me some type of information that lets me know what combination of outputs need to be turned on (what combination of outputs the customer purchased).
My original thought was POS sends me a decimal over modbus and I convert to a word. But like you stated the decimal for 128 bits is too large for decimal form. So now I'm trying to determine the next best solution.
POS could send array, string, maybe 4 double words. But I think I'd prefer an array. Reason being, the array index could represent the bits and the value of the array at the index could represent the value of the bit.
That is what I am thinking now but I would love suggestions from another who has more experience than me. This is my first time working with Modbus so I'd like to communicate as efficiently as possible.
Thank you again for responding to my question, I look forward to reading your response
so you get a limited decimal number
find the number in an array, giving you back the type number.
with this type you can set a lot of bits by using for simplicity 16 arrays of 8 bits or 8 arrays with words.
example POS says 123
array [200 types,2]
find number 123 in array, if found you get back a typenumber
another array has out [200,8] words
so go to typenumber and you will find the bits needed.
I'm not sure i am understanding. Do you know where I can research the concept to better understand.
What do you mean array [200 types, 2]? A 2-dimensional array of...? Is 123 a value of an array[index]? What exactly is typenumber...never heard of it before. Please know I am asking for clarity not being a pain or sarcastic. I am really trying to understand. Thank you for all your help
lets assume the factory makes a cabinet with max 128 drawers (your bits)
the customer checks the catalogue
in the cat there are lots of types like 3 drawer bottom is type 1
3 drawer top is type 2
3 drawer 5 from bottom is type 3
5 drawer 5 from bottom 6 drawers open then 2 drawers is type 4
etc.
and picks a cabinet.
he gives you the typenumber for example 3 as a word.
you have an array with these typenumbers as look up list and 8 words so for easy it is array [9,100] of word:=(.......,3,11100000,0,0,0,0,0,0,0,4,0000001111100000,0000000000000011,.......)
so word1 is array[2,2]word2 is 3,2 etc.