They are local variables. They do not exist outside the function.
Another thing you could do is schedule by completed cycles instead of by time:
const byte led1 = 2;
const byte led2 = 8;
unsigned CycleCount = 0;
unsigned long previousMillis = 0;
void blink(unsigned long onTime, unsigned long phaseDifference, unsigned long rate)
{
unsigned long elapsedTime = millis() - previousMillis;
if (elapsedTime >= rate)
{
previousMillis = millis(); // Start a new cycle
elapsedTime = 0;
CycleCount++;
}
if (elapsedTime < onTime)
digitalWrite(led1, HIGH);
else
digitalWrite(led1, LOW);
if (elapsedTime >= phaseDifference && elapsedTime < (phaseDifference + onTime))
digitalWrite(led2, HIGH);
else
digitalWrite(led2, LOW);
}
void setup()
{
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
}
void loop()
{
Serial.println((millis() / 1000) % 60);
if (CycleCount < 10) // Do 10 cycles
blink(50, 0, 2000);
else if (CycleCount < 20) // then 10 more cycles
blink(50, 100, 3000);
else if (CycleCount < 30) // then 10 more cycles
blink(50, 500, 1000);
else if (CycleCount < 40) // then 10 more cycles
blink(50, 100, 2000);
else
CycleCount = 0;
}