473,385 Members | 2,014 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

State machine in C#

I have a C++ application which I am porting to C#. This application is
controlling a transport belt. This transport belt is moving bins foreward
and backward. I have a state machine controlling this transport belt. In c++
there is an integer named state which holds the state of the belt. Bit 0-2
is telling which task is going on (move belt forward, move belt to middle
possition and so on..) Bit 3 is telling if there is a bin in the middle
possition of the belt. Bit 4-7 is telling some thing about the physical
state of the belt. Bit 8-11 is telling something about exceptions. This is
working well, but I think it is a little hard to understand if someone is
going to take over my code someday. I want to make this simpler. Maybe using
enums and the flags attribute? What do you think?

Thank you.
Nov 10 '06 #1
4 7130
I guest the enum with flags is a great option, I have someting like that
with an industrial printer, the printer have like 20 states (and varius of
the states can be set in some point of time), I have enum with flags to
indicate the state of the printer, and works very well.

Regards,

Bela Istok

"nyhetsgrupper" <ny***********@gmail.comwrote in message
news:es*************@TK2MSFTNGP02.phx.gbl...
>I have a C++ application which I am porting to C#. This application is
controlling a transport belt. This transport belt is moving bins foreward
and backward. I have a state machine controlling this transport belt. In
c++ there is an integer named state which holds the state of the belt. Bit
0-2 is telling which task is going on (move belt forward, move belt to
middle possition and so on..) Bit 3 is telling if there is a bin in the
middle possition of the belt. Bit 4-7 is telling some thing about the
physical state of the belt. Bit 8-11 is telling something about exceptions.
This is working well, but I think it is a little hard to understand if
someone is going to take over my code someday. I want to make this simpler.
Maybe using enums and the flags attribute? What do you think?

Thank you.

Nov 10 '06 #2

"nyhetsgrupper" <ny***********@gmail.comwrote in message
news:es*************@TK2MSFTNGP02.phx.gbl...
>I have a C++ application which I am porting to C#. This application is
controlling a transport belt. This transport belt is moving bins foreward
and backward. I have a state machine controlling this transport belt. In
c++ there is an integer named state which holds the state of the belt. Bit
0-2 is telling which task is going on (move belt forward, move belt to
middle possition and so on..) Bit 3 is telling if there is a bin in the
middle possition of the belt. Bit 4-7 is telling some thing about the
physical state of the belt. Bit 8-11 is telling something about exceptions.
This is working well, but I think it is a little hard to understand if
someone is going to take over my code someday. I want to make this simpler.
Maybe using enums and the flags attribute? What do you think?
Since you have memory to spare (else you wouldn't be used .NET), I would
recommend splitting the state into four separate 8-bit variables, with an
enum defining the appropriate states for each. Some enums (exceptions) will
probably need FlagsAttribute, but several of them probably won't. You'll
eliminate a lot of bitmask code which is a great confusion to many unskilled
programmers, and if you're concerned about the abilities of someone taking
over your code this could be a sticky point.

However, if you often switch based on the entire number, then I would take a
different tack. Leave the state variable as is, and make it even more
opaque. Provide properties to encapsulate the change in each subfield. I
don't believe this approach applies to your problem, because you said the
current task is indicated by only bits 0-2.

Remember that an FSM, whether Moore or Mealy model, branches on inputs as
well as current state. Don't complicate the code by storing these inputs in
extra bits of the current state variable. From your description, bits 0-2
are the state, and bits 3-11 contain three different input variables.
>
Thank you.

Nov 10 '06 #3
Hi,

It's not really a state machine if you're just "flagging" state. In other
words, if you're not performing any operations based on the current state then
enums should be just fine (as mentioned by another respondent). Although you
might want to use multiple enums instead of a single integer.

enum BeltDirection { Forward, Backward }

enum BinPosition { Start, Middle, End }

enum BinEnabledState { On, Off } // bool would be much easier ;)

If you want to use a flexible state machine architecture instead that actually
does provide different runtime logic depending on the current "state" of the
transport belt you could code something like this:

class TransportBeltController
{
private TransportBeltState state;
public TransportBeltState State
{
get
{
if (state == null)
state = new TransportBeltForwardState();

return state;
}
set
{
if (value == null)
throw new ArgumentNullException("State");

state = value;
}
}

public BinPosition MoveToNextBin()
{
State.MoveToNextBin();
return state.Position;
}
}

enum BinPosition { Start, Middle, End }

abstract class TransportBeltState
{
protected BinPosition binPos; // Start is default
public BinPosition Position { get { return binPos; } }

public abstract void MoveToNextBin();
}

class TransportBeltForwardState : TransportBeltState
{
public override void MoveToNextBin()
{
if (binPos == BinPosition.End)
binPos = BinPosition.Start;
else
binPos = ((int) binPos)++;
}
}

class TransportBeltBackwardState : TransportBeltState
{
public override void MoveToNextBin()
{
if (binPos == BinPosition.Start)
binPos = BinPosition.End;
else
binPos = ((int) binPos)--;
}
}

--
Dave Sexton

"nyhetsgrupper" <ny***********@gmail.comwrote in message
news:es*************@TK2MSFTNGP02.phx.gbl...
>I have a C++ application which I am porting to C#. This application is
controlling a transport belt. This transport belt is moving bins foreward and
backward. I have a state machine controlling this transport belt. In c++
there is an integer named state which holds the state of the belt. Bit 0-2 is
telling which task is going on (move belt forward, move belt to middle
possition and so on..) Bit 3 is telling if there is a bin in the middle
possition of the belt. Bit 4-7 is telling some thing about the physical state
of the belt. Bit 8-11 is telling something about exceptions. This is working
well, but I think it is a little hard to understand if someone is going to
take over my code someday. I want to make this simpler. Maybe using enums and
the flags attribute? What do you think?

Thank you.

Nov 10 '06 #4
You may even want to look at Windows Workflow for state and workflow.

--
William Stacey [C# MVP]

"nyhetsgrupper" <ny***********@gmail.comwrote in message
news:es*************@TK2MSFTNGP02.phx.gbl...
|I have a C++ application which I am porting to C#. This application is
| controlling a transport belt. This transport belt is moving bins foreward
| and backward. I have a state machine controlling this transport belt. In
c++
| there is an integer named state which holds the state of the belt. Bit 0-2
| is telling which task is going on (move belt forward, move belt to middle
| possition and so on..) Bit 3 is telling if there is a bin in the middle
| possition of the belt. Bit 4-7 is telling some thing about the physical
| state of the belt. Bit 8-11 is telling something about exceptions. This is
| working well, but I think it is a little hard to understand if someone is
| going to take over my code someday. I want to make this simpler. Maybe
using
| enums and the flags attribute? What do you think?
|
| Thank you.
|
|
Nov 11 '06 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Robert | last post by:
In Web.config file is a setting for sessionState. If I want to maintain a users' session state (ie use the Session object) in a web farm that is being load balanced by a Cisco CSS 11501 Switch. ...
0
by: Maciek | last post by:
Hi When I set Session state mode to StateServer (IIS 6.0; windows2003; .NET 2.0) in my application, I have recived this message:...
6
by: nilavya | last post by:
HI, I have got a C++ application involving State machine. Now I have got too many states and too many events which changes the state of the Staet machine. So my code is somewhat unmanageable....
4
by: Shawnk | last post by:
This post is intended to verify that true value semantics DO NOT EXIST for the Enum class (relative to boolean operations). If this is true then (thus and therefore) you can not design state...
67
by: Rui Maciel | last post by:
I've been delving into finite state machines and at this time it seems that the best way to implement them is through an intense use of the goto statement. Yet, everyone plus their granmother is...
11
by: tuom.larsen | last post by:
Dear list, I'm writing very simple state machine library, like this: _state = None def set_state(state): global _state _state = state
2
by: tat | last post by:
Hi all, Sorry if this question is off-topic. I would like have your suggestion . I need to write one application which control a machine via serial port. There are 5 states in the following...
3
by: Pallav singh | last post by:
Hi All i am getting Error while writing following code for state design Pattern kindly let me know How to Correct this Error ?? Thanks Pallav Singh ...
4
by: laktofil | last post by:
This may seem like an abstract question on behavioral inheritance. Anyway, I'm building a hierarchical state machine in C++ (with gcc for target platform Gentoo Linux). More precisely, I'm using this...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.